Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
struct /*iterator*/ ;
(1) ( только для демонстрации* )
Вспомогательные псевдонимы шаблонов
template < class I >
using /*iota-diff-t*/ = /* see below */ ;
(2) ( только для демонстрации* )
Вспомогательные концепции
template < class I >

концепт /*decrementable*/ =
std:: incrementable < I > && требует ( I i ) {
{ -- i } - > std:: same_as < I & > ;
{ i -- } - > std:: same_as < I > ;

} ;
(3) ( только для демонстрации* )
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) ( только для демонстрации* )
1) ranges:: iota_view < W, Bound > :: iterator является типом итераторов, возвращаемых begin() и end() для ranges:: iota_view < W, Bound > .
2) Вычисляет тип разности для обоих типов итераторов и integer-like types .
  • Если I не является целочисленным типом, или если это целочисленный тип и sizeof ( std:: iter_difference_t < I > ) больше, чем sizeof ( I ) , тогда /*iota-diff-t*/ < I > является std:: iter_difference_t < I > .
  • В противном случае, /*iota-diff-t*/ < I > является знаковым целочисленным типом с шириной большей, чем ширина I , если такой тип существует.
  • В противном случае, I является одним из самых широких целочисленных типов, и /*iota-diff-t*/ < I > является неуказанным signed-integer-like type с шириной не меньше ширины I . Не указано, моделирует ли /*iota-diff-t*/ < I > weakly_incrementable в этом случае.
3) Указывает, что тип является incrementable , и префиксный и постфиксный operator -- для этого типа имеют стандартную семантику.
4) Указывает, что тип является одновременно decrementable и totally_ordered , а также что operator + = , operator - = , operator + и operator - между типом и его отличающимся типом имеют общепринятое значение.

/*iterator*/ модели

Однако он удовлетворяет требованиям LegacyInputIterator только если W моделирует incrementable , и не удовлетворяет требованиям LegacyInputIterator в противном случае.

Содержание

Семантические требования

3) Тип I моделирует decrementable только если I удовлетворяет decrementable и все подразумеваемые концепты моделируются, и для равных объектов a и b типа I :
  • Если a и b находятся в области определения как пре-, так и пост- operator -- (т.е. они декрементируемы), тогда все следующие выражения true :
  • Если a и b находятся в области определения как пре-, так и пост- operator ++ (т.е. они инкрементируемы), тогда bool ( -- ( ++ a ) == b ) является 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
  • объекты a и b типа I и
  • значение n типа D ,

так что b достижим из a после n применений ++ a , выполняются все следующие условия:

  • ( a + = n ) равно b .
  • std:: addressof ( a + = n ) равен std:: addressof ( a ) .
  • I ( a + n ) равно ( a + = n ) .
  • Для любых двух положительных значений x и y типа D , если I ( a + D ( x + y ) ) корректно определено, тогда I ( a + D ( x + y ) ) равно I ( I ( a + x ) + y ) .
  • I ( a + D ( 0 ) ) равно a .
  • Если I ( a + D ( n - 1 ) ) корректно определено, тогда I ( a + n ) равно [ ] ( I c ) { return ++ c ; } ( I ( a + D ( n - 1 ) ) ) .
  • ( b + = - n ) равно a .
  • ( b - = n ) равно a .
  • std:: addressof ( b - = n ) равен std:: addressof ( b ) .
  • I ( b - n ) равно ( b - = n ) .
  • D ( b - a ) равно n .
  • D ( a - b ) равно D ( - n ) .
  • bool ( a <= b ) является true .

Вложенные типы

Тип Определение
iterator_concept тег итератора, см. ниже
iterator_category
(присутствует только если W моделирует incrementable и
/*iota-diff-t*/ < W > является целочисленным типом)
std::input_iterator_tag
value_type W
difference_type /*iota-diff-t*/ < W >

Определение концепции итератора

iterator_concept определяется следующим образом:

Члены данных

Участник Определение
W value_ текущее значение
( объект-участник только для демонстрации* )

Функции-члены

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_ .
2) Инициализирует value_ значением value .

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

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

Возвращает value_ .

Пример

#include <cassert>
#include <ranges>
int main()
{
    auto it{std::views::iota(6, 9).begin()};
    const int& r = *it; // связывается с временным объектом
    assert(*it == 6 and r == 6);
    ++it;
    assert(*it == 7 and r == 6);
}

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

constexpr /*iterator*/ & operator ++ ( ) ;
(1) (начиная с C++20)
constexpr void operator ++ ( int ) ;
(2) (начиная с C++20)
constexpr /*iterator*/ operator ++ ( int ) requires std:: incrementable < W > ;
(3) (начиная с C++20)
1) Эквивалентно ++ value_  ; return * this ; .
2) Эквивалентно ++ value_  ; .
3) Эквивалентно auto tmp = * this ; ++ value_  ; return tmp ; .

Пример

#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) Эквивалентно -- value_  ; return * this ; .
2) Эквивалентно auto tmp = * this ; -- value_  ; return tmp ; .

Пример

#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)

Обновляет value_ и возвращает * this :

Пример

#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)

Обновляет value_ и возвращает * this :

Пример

#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)

Возвращает W ( value_ + n ) .

Пример

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

Функции, не являющиеся членами класса

operator==, <, >, <=, >=, <=> (std::ranges::iota_view:: iterator )

friend constexpr bool operator ==

( const /*iterator*/ & x, const /*iterator*/ & y )

requires std:: equality_comparable < W > ;
(1) (начиная с C++20)
friend constexpr bool operator <

( const /*iterator*/ & x, const /*iterator*/ & y )

requires std:: totally_ordered < W > ;
(2) (начиная с C++20)
friend constexpr bool operator >

( const /*iterator*/ & x, const /*iterator*/ & y )

requires std:: totally_ordered < W > ;
(3) (начиная с C++20)
friend constexpr bool operator <=

( const /*iterator*/ & x, const /*iterator*/ & y )

requires std:: totally_ordered < W > ;
(4) (начиная с C++20)
friend constexpr bool operator >=

( const /*iterator*/ & x, const /*iterator*/ & y )

requires std:: totally_ordered < W > ;
(5) (начиная с C++20)
friend constexpr bool operator <=>

( const /*iterator*/ & x, const /*iterator*/ & y )

requires std:: totally_ordered < W > && std:: three_way_comparable < W > ;
(6) (начиная с C++20)
1) Возвращает x. value_ == y. value_ .
2) Возвращает x. value_ < y. value_ .
3) Возвращает y < x .
4) Возвращает ! ( y < x ) .
5) Возвращает ! ( x < y ) .
6) Возвращает x. value_ <=> y. value_ .

Оператор != синтезируется из operator== .

Эти функции не видны при обычном unqualified или qualified lookup , и могут быть найдены только с помощью argument-dependent lookup , когда iterator является ассоциированным классом аргументов.

operator+ (std::ranges::iota_view:: iterator )

friend constexpr /*iterator*/ operator +

( /*iterator*/ i, difference_type n )

requires /*advanceable*/ < W > ;
(1) (начиная с C++20)
friend constexpr /*iterator*/ operator +

( difference_type n, /*iterator*/ i )

requires /*advanceable*/ < W > ;
(2) (начиная с C++20)

Эквивалентно i + = n ; return i ; .

Эти функции не видны при обычном неквалифицированном поиске или квалифицированном поиске и могут быть найдены только с помощью поиска, зависимого от аргументов , когда 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) Эквивалентно i - = n ; return i ; .
2) Пусть D будет difference_type :

Эти функции не видны при обычном неквалифицированном или квалифицированном поиске и могут быть найдены только с помощью поиска, зависимого от аргументов , когда iterator является ассоциированным классом аргументов.

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

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