std::ranges:: iota_view<W, Bound>:: iterator
|
struct
/*iterator*/
;
|
(1) | ( только для демонстрации* ) |
|
Вспомогательные псевдонимы шаблонов
|
||
|
template
<
class
I
>
using /*iota-diff-t*/ = /* see below */ ; |
(2) | ( только для демонстрации* ) |
|
Вспомогательные концепции
|
||
|
template
<
class
I
>
концепт
/*decrementable*/
=
|
(3) | ( только для демонстрации* ) |
|
template
<
class
I
>
concept
/*advanceable*/
=
|
(4) | ( только для демонстрации* ) |
iterator
является типом итераторов, возвращаемых
begin()
и
end()
для
ranges::
iota_view
<
W, Bound
>
.
-
Если
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в этом случае.
incrementable
, и префиксный и постфиксный
operator
--
для этого типа имеют стандартную семантику.
decrementable
и
totally_ordered
, а также что
operator
+
=
,
operator
-
=
,
operator
+
и
operator
-
между типом и его отличающимся типом имеют общепринятое значение.
/*iterator*/ модели
-
random_access_iteratorесли W моделируетadvanceable(4) , -
bidirectional_iteratorесли W моделируетdecrementable(3) , -
forward_iteratorесли W моделируетincrementable, и -
input_iteratorв противном случае.
Однако он удовлетворяет требованиям
LegacyInputIterator
только если
W
моделирует
incrementable
, и не удовлетворяет требованиям
LegacyInputIterator
в противном случае.
Семантические требования
I
моделирует
decrementable
только если
I
удовлетворяет
decrementable
и все подразумеваемые концепты моделируются, и для равных объектов
a
и
b
типа
I
:
-
Если
a
и
b
находятся в области определения как пре-, так и пост-
operator
--
(т.е. они декрементируемы), тогда все следующие выражения
true
:
- std:: addressof ( -- a ) == std:: addressof ( a ) ,
- bool ( a -- == b ) ,
- bool ( ( ( void ) a -- , a ) == -- b ) ,
- bool ( ++ ( -- a ) == b ) .
- Если a и b находятся в области определения как пре-, так и пост- operator ++ (т.е. они инкрементируемы), тогда bool ( -- ( ++ a ) == b ) является 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
-
объекты
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моделируетadvanceable,iterator_conceptобозначает std::random_access_iterator_tag . -
Иначе, если
Wмоделируетdecrementable,iterator_conceptобозначает std::bidirectional_iterator_tag . -
Иначе, если
Wмоделируетincrementable,iterator_conceptобозначает std::forward_iterator_tag . -
Иначе,
iterator_conceptобозначает std::input_iterator_tag .
Члены данных
| Участник | Определение |
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) |
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) |
value_
;
return
*
this
;
.
value_
;
.
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) |
value_
;
return
*
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
:
-
Если
Wявляется беззнаковым целочисленным типом : -
В противном случае выполняет
value_+ = n .
Пример
#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
:
-
Если
Wявляется беззнаковым целочисленным типом : -
В противном случае выполняет
value_- = n .
Пример
#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
)
|
(1) | (начиная с C++20) |
|
friend
constexpr
bool
operator
<
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(2) | (начиная с C++20) |
|
friend
constexpr
bool
operator
>
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(3) | (начиная с C++20) |
|
friend
constexpr
bool
operator
<=
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(4) | (начиная с C++20) |
|
friend
constexpr
bool
operator
>=
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(5) | (начиная с C++20) |
|
friend
constexpr
bool
operator
<=>
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(6) | (начиная с C++20) |
Оператор
!=
синтезируется
из
operator==
.
Эти функции не видны при обычном unqualified или qualified lookup , и могут быть найдены только с помощью argument-dependent lookup , когда iterator является ассоциированным классом аргументов.
operator+ (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
+
(
/*iterator*/
i, difference_type n
)
|
(1) | (начиная с C++20) |
|
friend
constexpr
/*iterator*/
operator
+
(
difference_type n,
/*iterator*/
i
)
|
(2) | (начиная с C++20) |
Эквивалентно i + = n ; return i ; .
Эти функции не видны при обычном неквалифицированном поиске или квалифицированном поиске и могут быть найдены только с помощью поиска, зависимого от аргументов , когда iterator является ассоциированным классом аргументов.
operator- (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
-
(
/*iterator*/
i, difference_type n
)
|
(1) | (since C++20) |
|
friend
constexpr
difference_type operator
-
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(2) | (since C++20) |
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 |