c++ std::input_or_output_iterator和std::instructive_readable有什么区别?

lf5gs5x2  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(130)

在阅读这些概念时,我认为这两个概念都应该允许“解引用”类型的示例。我可以看到他们还有一些其他的要求,但它们似乎是次要的。那么,从语义上讲,为什么需要两个概念呢?
编辑:我目前对它们的理解就好像std::indirectly_readable + std::indirectly_writable =>接近std::input_or_output_iterator

siv3szwd

siv3szwd1#

input_or_output_iteratorindirectly_readableinput_iterator的两半。
indirectly_writableinput_or_output_iterator几乎是output_iterator的两半(也有*it++ = blah)。
input_or_output_iterator要求++在某种程度上是合理的(语义和语法上),并且要求无论*it是什么类型,引用它都是法律的的(即,它不是void,因为void&不是合法类型)。
indirectly_readableindirectly_writable*it提出了额外的要求,因此您可以(合理地)读/写它。
indirectly_writable需要*it = blah才能工作。
indirectly_readable要求std::iter_value_tstd::iter_reference_tstd::iter_rvalue_reference_t都存在,并且它们彼此之间以及与*it具有“合理”的关系。
std::input_iterator的引用类型不必是实际引用。但是如果它们不是实际的引用,你必须小心const&&&如何使用它们,因为这些子句实际上是为引用建模的:

std::common_reference_with<
  std::iter_reference_t<In>&&, std::iter_value_t<In>&
> &&
std::common_reference_with<
  std::iter_reference_t<In>&&, std::iter_rvalue_reference_t<In>&&
> &&
std::common_reference_with<
  std::iter_rvalue_reference_t<In>&&, const std::iter_value_t<In>&
>;

在引用上,这些子句基本上要求你的引用类型与你的值类型相关,你的右值引用类型与你的引用类型相关,你的右值引用类型与你的值类型的const&引用相关。
*it返回一个 value 确实有效(像int)。
使用“魔法”引用类型来实现这一点将是一个挑战。我不认为专门化https://en.cppreference.com/w/cpp/types/common_reference是法律的的。

相关问题