std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; |
(1) | (nur Exposition*) |
| Hilfs-Alias-Templates |
||
template< class I > using /*iota-diff-t*/ = /* siehe unten */; |
(2) | (nur Exposition*) |
| Hilfskonzepte |
||
template< class I > concept /*decrementable*/ = |
(3) | (nur Exposition*) |
template< class I > concept /*advanceable*/ = |
(4) | (nur Exposition*) |
iterator ist der Typ der Iteratoren, die von begin() und end() von ranges::iota_view<W, Bound> zurückgegeben werden.- Wenn
Ikein integraler Typ ist, oder wenn es ein integraler Typ ist und sizeof(std::iter_difference_t<I>) größer als sizeof(I) ist, dann ist /*iota-diff-t*/<I> std::iter_difference_t<I>. - Andernfalls ist /*iota-diff-t*/<I> ein vorzeichenbehafteter Ganzzahltyp, dessen Breite größer ist als die Breite von
I, falls ein solcher Typ existiert. - Andernfalls ist
Ieiner der breitesten integralen Typen, und /*iota-diff-t*/<I> ist ein nicht spezifizierter vorzeichenbehafteter Ganzzahl-ähnlicher Typ mit einer Breite, die nicht kleiner ist als die Breite vonI. Es ist nicht spezifiziert, ob /*iota-diff-t*/<I> in diesem Fallweakly_incrementablemodelliert.
incrementable ist und dass die Prä- und Postfix- operator-- für den Typ eine übliche Bedeutung haben.decrementable als auch totally_ordered ist und dass operator+=, operator-=, operator+ und operator- zwischen dem Typ und seinem Differenztyp eine übliche Bedeutung haben./*iterator*/ modelliert
-
random_access_iterator, wenn Wadvanceable(4) modelliert, -
bidirectional_iterator, wenn Wdecrementable(3) modelliert, -
forward_iterator, wenn Wincrementablemodelliert, und -
input_iteratorandernfalls.
Es erfüllt jedoch nur LegacyInputIterator, wenn W incrementable modelliert, und erfüllt andernfalls kein LegacyInputIterator.
[edit] Semantische Anforderungen
I modelliert decrementable nur, wenn I decrementable und alle von ihm umfassten Konzepte erfüllt, und bei gleichen Objekten a und b vom Typ I- Wenn a und b im Definitionsbereich von Prä- und Postfix- operator-- liegen (d. h. sie sind dekremetierbar), dann sind alle folgenden Ausdrücke true
- std::addressof(--a) = std::addressof(a),
- bool(a-- = = b),
- bool(((void)a--, a) = = --b),
- bool(++(--a) = = b).
- Wenn a und b im Definitionsbereich von Prä- und Postfix- operator++ liegen (d. h. sie sind inkremetierbar), dann ist bool(--(++a) = = b) true.
D /*iota-diff-t*/<I>. Typ I modelliert advanceable nur, wenn I advanceable und alle von ihm umfassten Konzepte erfüllt, und bei- Objekten a und b vom Typ
Iund - Wert n vom Typ
D,
so dass b von a nach n Anwendungen von ++a erreichbar ist, alle folgenden Bedingungen erfüllt sind
- (a += n) gleich b ist.
- std::addressof(a += n) ist gleich std::addressof(a).
- I(a + n) ist gleich (a += n).
- Für alle zwei positiven Werte x und y vom Typ
D, wenn I(a + D(x + y)) wohlgeformt ist, dann ist I(a + D(x + y)) gleich I(I(a + x) + y). - I(a + D(0)) ist gleich a.
- Wenn I+ D(0)) wohlgeformt ist, dann ist I(a + D(n - 1)) gleich [](I c) { return ++c; }(I+ D(n - 1))).
- (b += -n) ist gleich a.
- (b -= n) ist gleich a.
- std::addressof(b -= n) ist gleich std::addressof(b).
- I(b - n) ist gleich (b -= n).
- D(b - a) ist gleich n.
- D(a - b) ist gleich D(-n).
- bool(a <= b) ist true.
[edit] Verschachtelte Typen
| Typ | Definition |
iterator_concept
|
ein Iterator-Tag, siehe unten |
iterator_category(nur vorhanden, wenn W incrementable modelliert und/*iota-diff-t*/<W> ein integraler Typ ist) |
std::input_iterator_tag |
value_type
|
W
|
difference_type
|
/*iota-diff-t*/<W> |
[edit] Ermittlung des Iterator-Konzepts
iterator_concept ist wie folgt definiert
- Wenn
Wadvanceablemodelliert, bezeichnetiterator_conceptstd::random_access_iterator_tag. - Andernfalls, wenn
Wdecrementablemodelliert, bezeichnetiterator_conceptstd::bidirectional_iterator_tag. - Andernfalls, wenn
Wincrementablemodelliert, bezeichnetiterator_conceptstd::forward_iterator_tag. - Andernfalls bezeichnet
iterator_conceptstd::input_iterator_tag.
[edit] Datenmember
| Mitglied | Definition |
W value_ |
der aktuelle Wert ((exposition-only member object*) |
[edit] Member-Funktionen
std::ranges::iota_view::iterator::iterator
| /*iterator*/() requires std::default_initializable<W> = default; |
(1) | (seit C++20) |
| constexpr explicit /*iterator*/( W value ); |
(2) | (seit C++20) |
value_ mit Wertinitialisierung.std::ranges::iota_view::iterator::operator*
| constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
(seit C++20) | |
Gibt value_ zurück.
Beispiel
#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) | (seit C++20) |
| constexpr void operator++(int); |
(2) | (seit C++20) |
| constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; |
(3) | (seit C++20) |
value_ ; return *this;.value_ ;.value_ ; return tmp;.Beispiel
#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) | (seit C++20) |
| constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; |
(2) | (seit C++20) |
value_ ; return *this;.value_ ; return tmp;.Beispiel
#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>; |
(seit C++20) | |
Aktualisiert value_ und gibt *this zurück.
- Wenn
Wein unsigned-integer-like Typ ist - Andernfalls wird
value_+= n ausgeführt.
Beispiel
#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>; |
(seit C++20) | |
Aktualisiert value_ und gibt *this zurück.
- Wenn
Wein unsigned-integer-like Typ ist - Andernfalls wird
value_-= n ausgeführt.
Beispiel
#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>; |
(seit C++20) | |
Gibt W(value_ + n) zurück.
Beispiel
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it + 3) == 9); }
[edit] Nicht-Member-Funktionen
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
| friend constexpr bool operator== ( const /*iterator*/& x, const /*iterator*/& y ) |
(1) | (seit C++20) |
| friend constexpr bool operator< ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (seit C++20) |
| friend constexpr bool operator> ( const /*iterator*/& x, const /*iterator*/& y ) |
(3) | (seit C++20) |
| friend constexpr bool operator<= ( const /*iterator*/& x, const /*iterator*/& y ) |
(4) | (seit C++20) |
| friend constexpr bool operator>= ( const /*iterator*/& x, const /*iterator*/& y ) |
(5) | (seit C++20) |
| friend constexpr bool operator<=> ( const /*iterator*/& x, const /*iterator*/& y ) |
(6) | (seit C++20) |
Der Operator != wird aus operator== synthetisiert.
Diese Funktionen sind für die nicht-qualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch Argument-abhängige Suche gefunden werden, wenn iterator eine zugeordnete Klasse der Argumente ist.
operator+(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator+ ( /*iterator*/ i, difference_type n ) |
(1) | (seit C++20) |
| friend constexpr /*iterator*/ operator+ ( difference_type n, /*iterator*/ i ) |
(2) | (seit C++20) |
Äquivalent zu i += n; return i;.
Diese Funktionen sind für die nicht-qualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch Argument-abhängige Suche gefunden werden, wenn iterator eine zugeordnete Klasse der Argumente ist.
operator-(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator- ( /*iterator*/ i, difference_type n ) |
(1) | (seit C++20) |
| friend constexpr difference_type operator- ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (seit C++20) |
D difference_typeDiese Funktionen sind für die nicht-qualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch Argument-abhängige Suche gefunden werden, wenn iterator eine zugeordnete Klasse der Argumente ist.
[edit] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P2259R1 | C++20 | Member iterator_category ist immer definiert |
Nur definiert, wenn W incrementable erfüllt |
| LWG 3580 | C++20 | Körper von operator+ und operator- schließen implizites Verschieben aus | für implizites Verschieben geeignet gemacht |