std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; | (1) | (с C++20) (только для примера*) |
| Вспомогательные шаблоны псевдонимов | ||
template< class I > using /*iota-diff-t*/ = /* see below */; | (2) | (только для примера*) |
| Вспомогательные концепции | ||
template< class I >
concept /*decrementable*/ =
std::incrementable<I> && requires(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) | (только для примера*) |
iota_view::begin./*iota-diff-t*/ вычисляет тип разности для обоих типов итераторов и целочисленных типов. - Если
Wне является целочисленным типом или если это целочисленный тип и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>— неопределённый тип со знаком и целыми числами шириной не меньше шириныI. В этом случае не определено, моделирует ли/*iota-diff-t*/<I>weakly_incrementable.
decrementable определяет, что тип является incrementable, а пред- и пост-operator-- для типа имеют общее значение.advanceable определяет, что тип является как decrementable , так и totally_ordered, и operator+=, operator-=, operator+, и operator- между типом и его различными типами имеют общее значение.Семантические требования
3) ТипI моделирует decrementable только если I удовлетворяет decrementable и все подчинённые концепции моделируются, и заданы равные объекты a и b типа I: - Если
aиbнаходятся в области как пред-, так и пост-operator--(т.е. они уменьшаемы), то следующее являются истинными:-
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 обозначает /*iota-diff-t*/<I>. Тип I моделирует advanceable только если I удовлетворяет advanceable и все подчинённые концепции моделируются, и заданы - объекты
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 | std::input_iterator_tag если W моделирует incrementable.В противном случае, тип iterator_category отсутствует. |
value_type | W |
difference_type | /*iota-diff-t*/<W> |
Примечания: /*iterator*/
-
random_access_iterator, еслиWмоделируетadvanceable, -
bidirectional_iterator, еслиWмоделируетdecrementable, -
forward_iterator, еслиWмоделируетincrementable, и -
input_iteratorв противном случае.
Однако, он удовлетворяет LegacyInputIterator только если W моделирует incrementable, и не удовлетворяет LegacyInputIterator в противном случае.
Члены данных
| Имя члена | Определение |
|---|---|
value_ (private) | Значение типа W, используемое для обращения к элементу.(только для примера — объект члена*) |
Члены-функции
std::ranges::iota_view::iterator::iterator
/*iterator*/() requires std::default_initializable<W> = default; | (1) | (с C++20) |
constexpr explicit /*iterator*/( W value ); | (2) | (с C++20) |
value_ через его инициализатор по умолчанию (= W()).value_ значением value. Это значение будет возвращено operator* и увеличено на operator++. std::ranges::iota_view::iterator::operator*
constexpr W operator*() const
noexcept(std::is_nothrow_copy_constructible_v<W>);
| (с C++20) |
Возвращает текущее значение по значению (другими словами, это просмотр только для чтения).
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_;.auto tmp = *this; ++value_; return tmp;. std::ranges::iota_view::iterator::operator--
constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; | (1) | (с C++20) |
constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; | (2) | (с C++20) |
--value_; return *this;.auto tmp = *this; --value_; return tmp;. std::ranges::iota_view::iterator::operator+=
constexpr /*iterator*/& operator+=( difference_type n )
requires /*advanceable*/<W>;
| (с C++20) |
Если W — целого типа без знака, выполняет value_ += static_cast<W>(n) если n неотрицательно, value -= static_cast<W>(-n) в противном случае, а затем возвращает *this.
В противном случае, эквивалентно value_ += n; return *this;.
std::ranges::iota_view::iterator::operator-=
constexpr /*iterator*/& operator-=( difference_type n )
requires /*advanceable*/<W>;
| (с C++20) |
Если W — целого типа без знака, выполняет value_ -= static_cast<W>(n) если n неотрицательно, или value += static_cast<W>(-n) в противном случае, а затем возвращает *this.
В противном случае, эквивалентно value_ -= n; return *this;.
std::ranges::iota_view::iterator::operator[]
constexpr W operator[]( difference_type n ) const
requires /*advanceable*/<W>;
| (с C++20) |
Эквивалентно return W(value_ + n);.
Нечленные функции
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) |
return x.value_ == y.value_;.return x.value_ < y.value_;.return y < x;.return !(y < x);.return !(x < y);.return x.value_ <=> y.value_;.Оператор != синтезируется из operator==.
Эти функции не видны для обычного неквалифицированного или квалифицированного поиска и могут быть найдены только с помощью поиска, зависящего от аргументов, когда 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) | (с C++20) |
friend constexpr difference_type operator-( const /*iterator*/& x,
const /*iterator*/& y )
requires /*advanceable*/<W>;
| (2) | (с C++20) |
i -= n; return i;.D — difference_type. - Если
Wсо знаком, эквивалентноreturn D(D(x.value_) - D(y.value_));. - В противном случае, если
Wбез знака, эквивалентноreturn y.value_ > x.value_ ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_);. - В противном случае, эквивалентно
return x.value_ - y.value_;.
Эти функции не видны для обычного неквалифицированного или квалифицированного поиска и могут быть найдены только с помощью поиска, зависящего от аргументов, когда iterator является ассоциированным классом аргументов.
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, опубликованное | Корректное поведение |
|---|---|---|---|
| P2259R1 | C++20 | член iterator_category всегда определен | определен только если W удовлетворяет incrementable |
| LWG 3580 | C++20 | тела operator+ и operator- исключают явное перемещение | пригодны для явного перемещения |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/iota_view/iterator