微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

forward_iterator 概念的冗余?

如何解决forward_iterator 概念的冗余?

[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 哪些模型 semiregularequality_­comparable 哪些模型 weakly-equality-comparable-with<I,I>

为什么标准需要在这里添加一个看似多余的约束,这背后的考虑是什么?

解决方法

forward_­iterator 需要 sentinel_for 的语义要求。 regularequality_comparable 都没有暗示这些。

,

概念有明确的句法要求(即:这些表达式必须编译),但它们也有隐含的语义概念。 equality_comparable<T> 有一个语义要求,即如果 t == u,则 tu 具有相同的值,但是这是为 T 定义的。

但是 sentinel_for 需要对 t == u 有更具体的含义。哨兵和迭代器之间的相等意味着迭代器位于范围的末尾(因此,您不能取消引用它)。

所以这些概念并不是多余的;需要它们来表达 forward_iterator<T> 的语义。在这种情况下,针对另一个迭代器测试一个迭代器是检查序列末尾的有效方法。因此,前向迭代器的“值”的含义是“范围内的位置”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。