std::weakly_incrementable
<iterator>
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&>; // not required to be equality-preserving
i++; // not required to be equality-preserving
For the definition of /*is-signed-integer-like*/, see is-integer-like
.
This concept specifies requirements on types that can be incremented with the pre- and post-increment operators, but those increment operations are not necessarily equality-preserving, and the type itself is not required to be std::equality_comparable .
For std::weakly_incrementable
types, a == b does not imply that ++a == ++b. Algorithms on weakly incrementable types must be single-pass algorithms. These algorithms can be used with istreams as the source of the input data through std::istream_iterator .
For an object i of type I
, I
models std::weakly_incrementable
only if all following conditions are satisfied:
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P2325R3 | C++20 | default_initializable was required
|
not required |
weakly_incrementable
type is equality-preserving and that the type is equality_comparable