std::ranges::iota_view<W, Bound>::iterator

From cppreference.com
< cpp‎ | ranges‎ | iota view
Ranges library
Range adaptors
struct /*iterator*/;
(1) (exposition only*)
Helper alias templates
template < class I >
using /*iota-diff-t*/ = /* see below */ ;
(2) (exposition only*)
Helper concepts
template < class I >

concept /*decrementable*/ =
std::incrementable <I> && requires(I i) {
{ --i } - > std::same_as <I& > ;
{ i-- } - > std::same_as <I> ;

} ;
(3) (exposition only*)
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& > ;
        I(j + n) ;
        I(n + j) ;
        I(j - n) ;
{ j - j } - > std::convertible_to < /*iota-diff-t*/ <I>> ;

} ;
(4) (exposition only*)
1) ranges::iota_view<W, Bound>:: iterator is the type of the iterators returned by begin() and end() of ranges::iota_view<W, Bound>
2) Calculates the difference type for both iterator types and integer-like types.
  • If I 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
  • 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
3) Specifies that a type is incrementable, and pre- and post- operator--
4) Specifies that a type is both decrementable and totally_ordered, and operator+=, operator-=, operator+, and operator-

/*iterator*/ models

However, it only satisfies LegacyInputIterator if W models incrementable, and does not satisfy LegacyInputIterator

Semantic requirements

3) Type 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 and b are in the domain of both pre- and post- operator-- (i.e. they are decrementable), then the following are all true:
  • If a and b are in the domain of both pre- and post- operator++ (i.e. they are incrementable), then bool ( -- ( ++a) == b) is true
4) Let 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 and b of type I and
  • value n of type D,

such that b is reachable from a after n applications of ++a

  • (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 and y of type D, 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

Nested types

Type Definition
iterator_concept an iterator tag, see below
iterator_category
(only present if W models incrementable and
/*iota-diff-t*/<W>
std::input_iterator_tag
value_type W
difference_type /*iota-diff-t*/<W>

Determining the iterator concept

iterator_concept is defined as follows:

Data members

Member Definition
W value_ the current value
(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 value_.
2) Initializes value_ with value.

std::ranges::iota_view::iterator::operator*

constexpr W operator* ( ) const
noexcept ( std::is_nothrow_copy_constructible_v <W> ) ;
(since C++20)

Returns value_.

Example

#include <cassert>
#include <ranges>
 
int main()
{
    auto it{std::views::iota(6, 9).begin()};
    const int& r = *it; // binds with temporary
    assert(*it == 6 and r == 6);
    ++it;
    assert(*it == 7 and r == 6);
}

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)
1) Equivalent to ++ value_ ; return *this;
2) Equivalent to ++value_ ;
3) Equivalent to auto tmp = *this; ++ value_ ; return tmp;

Example

#include <cassert>
#include <ranges>
 
int main()
{
    auto it{std::views::iota(8).begin()};
    assert(*it == 8);
    assert(*++it == 9);
    assert(*it++ == 9);
    assert(*it == 10);
}

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)
1) Equivalent to -- value_ ; return *this;
2) Equivalent to auto tmp = *this; -- value_ ; return tmp;

Example

#include <cassert>
#include <ranges>
 
int main()
{
    auto it{std::views::iota(8).begin()};
    assert(*it == 8);
    assert(*--it == 7);
    assert(*it-- == 7);
    assert(*it == 6);
}

std::ranges::iota_view::iterator::operator+=

constexpr /*iterator*/ & operator+ = ( difference_type n )
    requires /*advanceable*/ <W> ;
(since C++20)

Updates value_ and returns *this:

Example

#include <cassert>
#include <ranges>
 
int main()
{
    auto it{std::views::iota(5).begin()};
    assert(*it == 5);
    assert(*(it += 3) == 8);
}

std::ranges::iota_view::iterator::operator-=

constexpr /*iterator*/ & operator- = ( difference_type n )
    requires /*advanceable*/ <W> ;
(since C++20)

Updates value_ and returns *this:

Example

#include <cassert>
#include <ranges>
 
int main()
{
    auto it{std::views::iota(6).begin()};
    assert(*it == 6);
    assert(*(it -= -3) == 9);
}

std::ranges::iota_view::iterator::operator[]

constexpr W operator[ ] ( difference_type n ) const
    requires /*advanceable*/ <W> ;
(since C++20)

Returns W( value_ + n)

Example

#include <cassert>
#include <ranges>
 
int main()
{
    auto it{std::views::iota(6).begin()};
    assert(*it == 6);
    assert(*(it + 3) == 9);
}

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)
1) Returns x. value_ == y. value_
2) Returns x. value_ < y. value_
3) Returns y < x.
4) Returns !(y < x).
5) Returns !(x < y).
6) Returns 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

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

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 )

    requires /*advanceable*/ <W> ;
(2) (since C++20)
1) Equivalent to i -= n; return i;
2) Let D be difference_type:

These functions are not visible to ordinary unqualified or qualified lookup, and can only be found by argument-dependent lookup when iterator

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