C++20引入了标准库中不同类型迭代器的适当概念(输入、输出、前向、双向、随机访问等)。
尽管这些类型的原始命名要求根本未提及{{link1:std::iterator_traits
的迭代器标签}},但新的C++20概念明确要求它们。例如,参见input_iterator
概念({{link2:[iterator.concept.input]}}):
template<class I>
concept input_iterator =
input_or_output_iterator<I> &&
indirectly_readable<I> &&
requires { typename ITER_CONCEPT(I); } &&
derived_from<ITER_CONCEPT(I), input_iterator_tag>;
注意最后一行对迭代器标签的检查。所有迭代器概念都像这样检查相应的标记,比如除输出迭代器之外。在这方面,输出迭代器一直是特殊的自 Ranges TS 的早期以来:
为什么要对输出迭代器进行这种特殊处理呢?与 C++ 标准中的输出迭代器要求不同, Ranges TS 中的 OutputIterator 不要求定义迭代器类别标记。
+
和+=
运算符,forward 没有--
运算符。如果它们可以通过语法区分,为什么我需要额外的机制呢?而且,即使在满足语法要求时有 opt-out 的理由,为什么现在这个理由不适用于输出迭代器呢? - ComicSansMSto_address
)。 - Nicol Bolasiterator
和output_iterator
具有可检测的语法要求。因此,一个概念可以自动检测到一个并防止另一个。而在input_iterator
和forward_iterator
之间不存在这种情况;它们之间的差异全部是语义上的(复制一个的含义等等)。 - Nicol Bolaspointer_traits
特化,to_address
就适用于任何带有->
的东西。 - T.C.