在阅读这些概念时,我认为这两个概念都应该允许“解引用”类型的示例。我可以看到他们还有一些其他的要求,但它们似乎是次要的。那么,从语义上讲,为什么需要两个概念呢?编辑:我目前对它们的理解就好像std::indirectly_readable + std::indirectly_writable =>接近std::input_or_output_iterator
std::indirectly_readable
std::indirectly_writable
std::input_or_output_iterator
siv3szwd1#
input_or_output_iterator和indirectly_readable是input_iterator的两半。indirectly_writable和input_or_output_iterator几乎是output_iterator的两半(也有*it++ = blah)。input_or_output_iterator要求++在某种程度上是合理的(语义和语法上),并且要求无论*it是什么类型,引用它都是法律的的(即,它不是void,因为void&不是合法类型)。indirectly_readable和indirectly_writable对*it提出了额外的要求,因此您可以(合理地)读/写它。indirectly_writable需要*it = blah才能工作。indirectly_readable要求std::iter_value_t、std::iter_reference_t、std::iter_rvalue_reference_t都存在,并且它们彼此之间以及与*it具有“合理”的关系。std::input_iterator的引用类型不必是实际引用。但是如果它们不是实际的引用,你必须小心const&和&&如何使用它们,因为这些子句实际上是为引用建模的:
input_or_output_iterator
indirectly_readable
input_iterator
indirectly_writable
output_iterator
*it++ = blah
++
*it
void
void&
*it = blah
std::iter_value_t
std::iter_reference_t
std::iter_rvalue_reference_t
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是法律的的。
int
1条答案
按热度按时间siv3szwd1#
input_or_output_iterator
和indirectly_readable
是input_iterator
的两半。indirectly_writable
和input_or_output_iterator
几乎是output_iterator
的两半(也有*it++ = blah
)。input_or_output_iterator
要求++
在某种程度上是合理的(语义和语法上),并且要求无论*it
是什么类型,引用它都是法律的的(即,它不是void
,因为void&
不是合法类型)。indirectly_readable
和indirectly_writable
对*it
提出了额外的要求,因此您可以(合理地)读/写它。indirectly_writable
需要*it = blah
才能工作。indirectly_readable
要求std::iter_value_t
、std::iter_reference_t
、std::iter_rvalue_reference_t
都存在,并且它们彼此之间以及与*it
具有“合理”的关系。std::input_iterator
的引用类型不必是实际引用。但是如果它们不是实际的引用,你必须小心const&
和&&
如何使用它们,因为这些子句实际上是为引用建模的:在引用上,这些子句基本上要求你的引用类型与你的值类型相关,你的右值引用类型与你的引用类型相关,你的右值引用类型与你的值类型的
const&
引用相关。从
*it
返回一个 value 确实有效(像int
)。使用“魔法”引用类型来实现这一点将是一个挑战。我不认为专门化https://en.cppreference.com/w/cpp/types/common_reference是法律的的。