table of contents
std::ranges::iota_view::iterator(3) | C++ Standard Libary | std::ranges::iota_view::iterator(3) |
NAME¶
std::ranges::iota_view::iterator - std::ranges::iota_view::iterator
Synopsis¶
struct /*iterator*/; (1) (since C++20)
(exposition only*)
Helper alias templates
template< class I > (2) (exposition only*)
using /*iota-diff-t*/ = /* see below */;
Helper concepts
template< class I >
concept /*decrementable*/ =
std::incrementable<I> && requires(I i) { (3) (exposition
only*)
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};
template< class I >
concept /*advanceable*/ =
/*decrementable*/<I> && std::totally_ordered<I>
&&
requires(I i, const I j, const /*iota-diff-t*/<I> n) {
{ i += n } -> std::same_as<I&>;
{ i -= n } -> std::same_as<I&>; (4) (exposition only*)
I(j + n);
I(n + j);
I(j - n);
{ j - j } -> std::convertible_to</*iota-diff-t*/<I>>;
};
1) The return type of iota_view::begin.
2) The alias template /*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 of I.
It
is unspecified whether /*iota-diff-t*/<I> models weakly_incrementable
in this
case.
3) The concept decrementable specifies that a type is incrementable, and pre-
and
post- operator-- for the type have common meaning.
4) The concept 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.
Member types¶
Member type Definition
* std::random_access_iterator_tag if W models advanceable.
Otherwise,
* std::bidirectional_iterator_tag if W models decrementable.
iterator_concept Otherwise,
* 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
* random_access_iterator if W models advanceable,
* bidirectional_iterator if W models decrementable,
* forward_iterator if W models incrementable, and
* input_iterator otherwise.
However, it only satisfies LegacyInputIterator if W models incrementable, and
does
not satisfy LegacyInputIterator otherwise.
Data members
Member name Definition
value_ (private) The value of type W used for dereferencing.
(exposition-only member object*)
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)
1) Value initializes the data member value_ via its default member
initializer (=
W()).
2) Initializes the data member value_ with value. This value will be returned
by
operator* and incremented by operator++.
std::ranges::iota_view::iterator::operator*
constexpr W operator*() const (since C++20)
noexcept(std::is_nothrow_copy_constructible_v<W>);
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 (3) (since
C++20)
std::incrementable<W>;
1) Equivalent to ++value_; return *this;.
2) Equivalent to ++value_;.
3) Equivalent to auto tmp = *this; ++value_; return tmp;.
std::ranges::iota_view::iterator::operator--
constexpr /*iterator*/& operator--() requires (1) (since
C++20)
/*decrementable*/<W>;
constexpr /*iterator*/operator--(int) requires (2) (since
C++20)
/*decrementable*/<W>;
1) Equivalent to --value_; return *this;.
2) Equivalent to auto tmp = *this; --value_; return tmp;.
std::ranges::iota_view::iterator::operator+=
constexpr /*iterator*/& operator+=( difference_type n ) (since
C++20)
requires /*advanceable*/<W>;
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 ) (since
C++20)
requires /*advanceable*/<W>;
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 (since C++20)
requires /*advanceable*/<W>;
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 ) (1) (since C++20)
requires std::equality_comparable<W>;
friend constexpr bool operator< ( const /*iterator*/& x, const
/*iterator*/& y ) (2) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator> ( const /*iterator*/& x, const
/*iterator*/& y ) (3) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator<= ( const /*iterator*/& x, const
/*iterator*/& y ) (4) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator>= ( const /*iterator*/& x, const
/*iterator*/& y ) (5) (since C++20)
requires std::totally_ordered<W>;
friend constexpr bool operator<=>( const /*iterator*/& x, const
/*iterator*/& y ) (6) (since C++20)
requires std::totally_ordered<W> &&
std::three_way_comparable<W>;
1) Equivalent to return x.value_ == y.value_;.
2) Equivalent to return x.value_ < y.value_;.
3) Equivalent to return y < x;.
4) Equivalent to return !(y < x);.
5) Equivalent to return !(x < y);.
6) Equivalent to return x.value_ <=> y.value_;.
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 ) (1) (since C++20)
requires /*advanceable*/<W>;
friend constexpr /*iterator*/ operator+( difference_type n,
/*iterator*/ i ) (2) (since C++20)
requires /*advanceable*/<W>;
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 ) (1) (since C++20)
requires /*advanceable*/<W>;
friend constexpr difference_type operator-( const /*iterator*/& x,
const /*iterator*/& y (2) (since C++20)
)
requires /*advanceable*/<W>;
1) Equivalent to i -= n; return i;.
2) Let 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 only if W satisfies
defined incrementable
LWG 3580 C++20 bodies of operator+ and operator- made suitable for implicit
rule out implicit move move
2024.06.10 | http://cppreference.com |