【发布时间】:2021-08-18 19:20:09
【问题描述】:
在[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>;
而std::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 哪个模型 semiregular 和 equality_comparable 哪个模型 weakly-equality-comparable-with<I, I>。
为什么标准需要在这里添加一个看起来多余的约束,这背后的考虑是什么?
【问题讨论】:
标签: c++ iterator c++20 c++-concepts