forward_iterator概念的冗余?
The redundancy of forward_iterator concept?
在[iterator.concept.forward]中,std::forward_iterator
定义为:
template<class I>
concept forward_iterator =
input_iterator<I> &&
derived_from<ITER_CONCEPT(I), forward_iterator_tag> &&
incrementable<I> &&
sentinel_for<I, I>;
template<class S, class I>
concept sentinel_for =
semiregular<S> &&
input_or_output_iterator<I> &&
weakly-equality-comparable-with<S, I>;
这在 std::forward_iterator
的要求中似乎是多余的,因为 input_iterator
已经为 input_or_output_iterator
建模,而 incrementable
定义为:
template<class I>
concept incrementable =
regular<I> &&
weakly_incrementable<I> &&
requires(I i) {
{ i++ } -> same_as<I>;
};
哪些型号 regular
which models semiregular
and equality_comparable
哪些型号 weakly-equality-comparable-with<I, I>
。
为什么标准需要在这里添加一个看似多余的约束,这背后的考虑是什么?
forward_iterator
需要 sentinel_for
的语义要求。 regular
或 equality_comparable
.
均未暗示这些
概念有明确的语法要求(即:这些表达式必须编译),但它们也有隐含的语义概念。 equality_comparable<T>
有一个语义要求,即如果 t == u
,则 t
和 u
具有相同的值,但是这是为 T
.
定义的
但是 sentinel_for
需要 t == u
更具体的含义。哨兵和迭代器之间的相等意味着迭代器位于范围的末尾(因此,您不能取消引用它)。
所以这些概念都不是多余的;需要它们来表达 forward_iterator<T>
的语义。在这种情况下,针对另一个迭代器测试一个迭代器是检查序列结尾的有效方法。因此,前向迭代器的“值”的含义是“范围内的位置”。
在[iterator.concept.forward]中,std::forward_iterator
定义为:
template<class I>
concept forward_iterator =
input_iterator<I> &&
derived_from<ITER_CONCEPT(I), forward_iterator_tag> &&
incrementable<I> &&
sentinel_for<I, I>;
template<class S, class I>
concept sentinel_for =
semiregular<S> &&
input_or_output_iterator<I> &&
weakly-equality-comparable-with<S, I>;
这在 std::forward_iterator
的要求中似乎是多余的,因为 input_iterator
已经为 input_or_output_iterator
建模,而 incrementable
定义为:
template<class I>
concept incrementable =
regular<I> &&
weakly_incrementable<I> &&
requires(I i) {
{ i++ } -> same_as<I>;
};
哪些型号 regular
which models semiregular
and equality_comparable
哪些型号 weakly-equality-comparable-with<I, I>
。
为什么标准需要在这里添加一个看似多余的约束,这背后的考虑是什么?
forward_iterator
需要 sentinel_for
的语义要求。 regular
或 equality_comparable
.
概念有明确的语法要求(即:这些表达式必须编译),但它们也有隐含的语义概念。 equality_comparable<T>
有一个语义要求,即如果 t == u
,则 t
和 u
具有相同的值,但是这是为 T
.
但是 sentinel_for
需要 t == u
更具体的含义。哨兵和迭代器之间的相等意味着迭代器位于范围的末尾(因此,您不能取消引用它)。
所以这些概念都不是多余的;需要它们来表达 forward_iterator<T>
的语义。在这种情况下,针对另一个迭代器测试一个迭代器是检查序列结尾的有效方法。因此,前向迭代器的“值”的含义是“范围内的位置”。