【问题标题】:The redundancy of forward_iterator concept?forward_iterator 概念的冗余?
【发布时间】: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&lt;I, I&gt;定义为:

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&lt;I, I&gt;

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

【问题讨论】:

    标签: c++ iterator c++20 c++-concepts


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多