std::weakly_incrementable

< cpp‎ | iterator
在标头 <iterator> 定义
template< class I >

    concept weakly_incrementable =
        std::movable<I> &&
        requires(I i) {
            typename std::iter_difference_t<I>;
            requires /*is-signed-integer-like*/<std::iter_difference_t<I>>;
            { ++i } -> std::same_as<I&>; // 不要求保持相等性
            i++;                         // 不要求保持相等性

        };
(C++20 起)

/*is-signed-integer-like*/ 的定义见 is-integer-like

此概念指定“能以前后自增运算符自增的类型”上的要求,不过这些自增运算不要求保持相等性,而且不要求类型自身为 std::equality_comparable

对于 std::weakly_incrementable 类型,a == b 不蕴含 ++a == ++b。弱可自增类型上的算法必须是单趟算法。这些算法能通过 std::istream_iterator 用于作为输入数据源的 istream

语义要求

对于 I 类型的对象 i,只有在满足以下所有条件时 I 才会实现 std::weakly_incrementable

  • 表达式 ++ii++ 拥有相同定义域。
  • 如果 i 可自增,那么 ++ii++ 都会增加 i
  • 如果 i 可自增,那么 std::addressof(++i) == std::addressof(i)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
P2325R3 C++20 要求 default_initializable 不要求

参阅

(C++20)
指定 weakly_incrementable 类型上的自增操作保持相等性,而且该类型为 equality_comparable
(概念)