std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; |
(1) | (since C++20) |
Helper alias templates |
||
template< class I > using /*iota-diff-t*/ = /* see below */; // exposition only |
(2) | (since C++20) |
Helper concepts |
||
template< class I > concept /*decrementable*/ = // exposition only |
(3) | (since C++20) |
template< class I > concept /*advanceable*/ = // exposition only |
(4) | (since C++20) |
iota-diff-t
calculates the difference type for both iterator types and integer-like types.
- If
W
is not an integral type, or if it is an integral type and sizeof(std::iter_difference_t<I>) is greater than sizeof(I), then /*iota-diff-t*/<I> is std::iter_difference_t<I>. - Otherwise, /*iota-diff-t*/<I> is a signed integer type of width greater than the width of
I
if such a type exists. - Otherwise,
I
is one of the widest integral types, and /*iota-diff-t*/<I> is an unspecified signed-integer-like type of width not less than the width ofI
. It is unspecified whether /*iota-diff-t*/<I> modelsweakly_incrementable
in this case.
decrementable
specifies that a type is incrementable
, and pre- and post- operator-- for the type have common meaning.advanceable
specifies that a type is both decrementable
and totally_ordered
, and operator+=, operator-=, operator+, and operator- among the type and its different type have common meaning.Semantic requirements
I
models decrementable
only if I
satisfies decrementable
and all concepts it subsumes are modeled, and given equal objects a
and b
of type I
:
- If
a
andb
are in the domain of both pre- and post- operator-- (i.e. they are decrementable), then the following are all true:- std::addressof(--a) == std::addressof(a),
- bool(a-- == b),
- bool(((void)a--, a) == --b),
- bool(++(--a) == b).
- If
a
andb
are are in the domain of both pre- and post- operator++ (i.e. they are incrementable), then bool(--(++a) == b) is true.
D
denote /*iota-diff-t*/<I>. Type I
models advanceable
only if I
satisfies advanceable
and all concepts it subsumes are modeled, and given
- objects
a
andb
of typeI
and - value
n
of typeD
,
such that b
is reachable from a
after n
applications of ++a, all following conditions are satisfied:
- (a += n) is equal to
b
. - std::addressof(a += n) is equal to std::addressof(a).
- I(a + n) is equal to (a += n).
- For any two positive values
x
andy
of typeD
, if I(a + D(x + y)) is well-defined, then I(a + D(x + y)) is equal to I(I(a + x) + y). - I(a + D(0)) is equal to
a
. - If I(a + D(n - 1)) is well-defined, then I(a + n) is equal to [](I c) { return ++c; }(I(a + D(n - 1))).
- (b += -n) is equal to
a
. - (b -= n) is equal to
a
. - std::addressof(b -= n) is equal to std::addressof(b).
- I(b - n) is equal to (b -= n).
- D(b - a) is equal to
n
. - D(a - b) is equal to D(-n).
- bool(a <= b) is true.
Member types
Member type | Definition |
iterator_concept
|
std::random_access_iterator_tag if W models advanceable .Otherwise, std::bidirectional_iterator_tag if W models decrementable .Otherise, std::forward_iterator_tag if W models incrementable .Otherwise, std::input_iterator_tag. |
iterator_category
|
std::input_iterator_tag if W models incrementable .Otherwise, there is no member type iterator_category .
|
value_type
|
W
|
difference_type
|
/*iota-diff-t*/<W> |
Notes: /*iterator*/ is
- a
random_access_iterator
if W modelsadvanceable
, - a
bidirectional_iterator
if W modelsdecrementable
, - a
forward_iterator
if W modelsincrementable
, and - an
input_iterator
otherwise.
However, it only satisfies LegacyInputIterator if W
models incrementable
, and does not satisfy LegacyInputIterator otherwise.
Data members
Typical implementation of this iterator type holds one data member of type W
(shown here as value_): the value used for dereferencing.
Member functions
std::ranges::iota_view::iterator::iterator
/*iterator*/() requires std::default_initializable<W> = default; |
(1) | (since C++20) |
constexpr explicit /*iterator*/( W value ); |
(2) | (since C++20) |
value_
via its default member initializer (= W()).value_
with value
. This value will be returned by operator* and incremented by operator++.
std::ranges::iota_view::iterator::operator*
constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
(since C++20) | |
Returns the current value, by value (in other words, this is a read-only view).
std::ranges::iota_view::iterator::operator++
constexpr /*iterator*/& operator++() |
(1) | (since C++20) |
constexpr void operator++(int) |
(2) | (since C++20) |
constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; |
(3) | (since C++20) |
std::ranges::iota_view::iterator::operator--
constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; |
(1) | (since C++20) |
constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; |
(2) | (since C++20) |
std::ranges::iota_view::iterator::operator+=
constexpr /*iterator*/& operator+=( difference_type n ) requires /*advanceable*/<W>; |
(since C++20) | |
If W
is unsigned-integer-like, performs value_ += static_cast<W>(n) if n
is non-negative, value -= static_cast<W>(-n) otherwise, and then returns *this.
Otherwise, equivalent to value_ += n; return *this;.
std::ranges::iota_view::iterator::operator-=
constexpr /*iterator*/& operator-=( difference_type n ) requires /*advanceable*/<W>; |
(since C++20) | |
If W
is unsigned-integer-like, performs value_ -= static_cast<W>(n) if n
is non-negative, or value += static_cast<W>(-n) otherwise, and then returns *this.
Otherwise, equivalent to value_ -= n; return *this;.
std::ranges::iota_view::iterator::operator[]
constexpr W operator[]( difference_type n ) const requires /*advanceable*/<W>; |
(since C++20) | |
Equivalent to return W(value_ + n);.
Non-member functions
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
friend constexpr bool operator== (const /*iterator*/& x, const /*iterator*/& y) requires std::equality_comparable<W>; |
(1) | (since C++20) |
friend constexpr bool operator< (const /*iterator*/& x, const /*iterator*/& y) requires std::totally_ordered<W>; |
(2) | (since C++20) |
friend constexpr bool operator> (const /*iterator*/& x, const /*iterator*/& y) requires std::totally_ordered<W>; |
(3) | (since C++20) |
friend constexpr bool operator<= (const /*iterator*/& x, const /*iterator*/& y) requires std::totally_ordered<W>; |
(4) | (since C++20) |
friend constexpr bool operator>= (const /*iterator*/& x, const /*iterator*/& y) requires std::totally_ordered<W>; |
(5) | (since C++20) |
friend constexpr bool operator<=>(const /*iterator*/& x, const /*iterator*/& y) requires std::totally_ordered<W> && std::three_way_comparable<W>; |
(6) | (since C++20) |
The !=
operator is synthesized from operator==
.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator
is an associated class of the arguments.
operator+(std::ranges::iota_view::iterator)
friend constexpr /*iterator*/ operator+( /*iterator*/ i, difference_type n ) requires /*advanceable*/<W>; |
(1) | (since C++20) |
friend constexpr /*iterator*/ operator+( difference_type n, /*iterator*/ i ) requires /*advanceable*/<W>; |
(2) | (since C++20) |
Equivalent to i += n; return i;.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator
is an associated class of the arguments.
operator-(std::ranges::iota_view::iterator)
friend constexpr /*iterator*/ operator-( /*iterator*/ i, difference_type n ) requires /*advanceable*/<W>; |
(1) | (since C++20) |
friend constexpr difference_type operator-( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (since C++20) |
D
be difference_type
.
- If
W
is signed-integer-like, equivalent to return D(D(x.value_) - D(y.value_));. - Otherwise, if
W
is unsigned-integer-like, equivalent to return y.value_ > x.value_ ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_);. - Otherwise, equivalent to return x.value_ - y.value_;.
These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator
is an associated class of the arguments.
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P2259R1 | C++20 | member iterator_category is always defined
|
defined only if W satisfies incrementable
|
LWG 3580 | C++20 | bodies of operator+ and operator- rule out implicit move
|
made suitable for implicit move |