std::ranges:: iota_view<W, Bound>:: iterator
|
struct
/*iterator*/
;
|
(1) | ( exposition only* ) |
|
Hilfs-Alias-Templates
|
||
|
template
<
class
I
>
using /*iota-diff-t*/ = /* siehe unten */ ; |
(2) | ( Nur zur Darstellung* ) |
|
Hilfskonzepte
|
||
|
template
<
class
I
>
Konzept
/*decrementable*/
=
|
(3) | ( Nur zur Veranschaulichung* ) |
|
template
<
class
I
>
concept
/*advanceable*/
=
|
(4) | ( exposition only* ) |
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 ist als sizeof ( I ) , dann ist /*iota-diff-t*/ < I > gleich std:: iter_difference_t < I > . -
Andernfalls ist
/*iota-diff-t*/
<
I
>
ein vorzeichenbehafteter Ganzzahltyp mit größerer Breite als
I, falls ein solcher Typ existiert. -
Andernfalls ist
Ieiner der breitesten integralen Typen, und /*iota-diff-t*/ < I > ist ein nicht spezifizierter signed-integer-like type mit einer Breite nicht kleiner als die Breite vonI. In diesem Fall ist nicht spezifiziert, ob /*iota-diff-t*/ < I > das Konzeptweakly_incrementablemodelliert.
incrementable
ist, und Prä- und Post-
operator
--
für den Typ die übliche Bedeutung haben.
decrementable
als auch
totally_ordered
ist, und dass
operator
+
=
,
operator
-
=
,
operator
+
und
operator
-
zwischen dem Typ und seinem unterschiedlichen Typ eine gemeinsame Bedeutung haben.
/*iterator*/ Modelle
-
random_access_iteratorwenn W das Konzeptadvanceable(4) modelliert, -
bidirectional_iteratorwenn W das Konzeptdecrementable(3) modelliert, -
forward_iteratorwenn W das Konzeptincrementablemodelliert, und -
input_iteratorandernfalls.
Es erfüllt jedoch nur
LegacyInputIterator
, wenn
W
das Konzept
incrementable
modelliert, und erfüllt
LegacyInputIterator
andernfalls nicht.
Semantische Anforderungen
I
modelliert
decrementable
nur dann, wenn
I
decrementable
erfüllt und alle davon subsumierten Konzepte modelliert werden, und für gleiche Objekte
a
und
b
vom Typ
I
:
-
Wenn
a
und
b
im Definitionsbereich sowohl von Prä- als auch Post-
operator
--
liegen (d.h. sie sind dekrementierbar), 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 sowohl von Prä- als auch Post- operator ++ liegen (d.h. sie sind inkrementierbar), dann ist 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
-
Objekte
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 ) entspricht b .
- std:: addressof ( a + = n ) ist gleich std:: addressof ( a ) .
- I ( a + n ) entspricht ( a + = n ) .
-
Für zwei beliebige positive Werte
x
und
y
vom Typ
D, falls I ( a + D ( x + y ) ) wohldefiniert ist, dann ist I ( a + D ( x + y ) ) gleich I ( I ( a + x ) + y ) . - I ( a + D ( 0 ) ) ist gleich a .
- Wenn I ( a + D ( n - 1 ) ) wohldefiniert ist, dann ist I ( a + n ) gleich [ ] ( I c ) { return ++ c ; } ( I ( a + D ( n - 1 ) ) ) .
- ( b + = - n ) entspricht a .
- ( b - = n ) entspricht 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 .
Verschachtelte Typen
| Typ | Definition |
iterator_concept
|
ein Iterator-Tag , siehe unten |
iterator_category
(nur vorhanden, wenn
W
das Konzept
incrementable
modelliert und
/*iota-diff-t*/ < W > ein integraler Typ ist) |
std::input_iterator_tag |
value_type
|
W
|
difference_type
|
/*iota-diff-t*/ < W > |
Bestimmung des Iterator-Konzepts
iterator_concept
ist wie folgt definiert:
-
Falls
Wdas Konzeptadvanceablemodelliert, bezeichnetiterator_conceptstd::random_access_iterator_tag . -
Andernfalls, falls
Wdas Konzeptdecrementablemodelliert, bezeichnetiterator_conceptstd::bidirectional_iterator_tag . -
Andernfalls, falls
Wdas Konzeptincrementablemodelliert, bezeichnetiterator_conceptstd::forward_iterator_tag . -
Andernfalls
bezeichnet
iterator_conceptstd::input_iterator_tag .
Datenmitglieder
| Mitglied | Definition |
W
value_
|
der aktuelle Wert
( Nur-Darstellungs-Mitgliedsobjekt* ) |
Memberfunktionen
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_
.
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; // bindet an temporäres Objekt assert(*it == 6 and r == 6); ++it; assert(*it == 7 and r == 6); }
`, `
` und `` Tags
- C++-spezifische Begriffe wie `constexpr`, `noexcept`, `operator*`, `const`, `assert`, etc.
- Technische Bezeichnungen wie `value_`
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 type ist: -
Andernfalls führt
value_+ = n aus.
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 type ist: -
Andernfalls führt
value_- = n aus.
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); }
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
synthetisiert
aus
operator==
.
Diese Funktionen sind für gewöhnliches unqualified oder qualified lookup nicht sichtbar und können nur durch argument-dependent lookup gefunden werden, wenn iterator eine assoziierte Klasse der Argumente ist.
operator+ (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
+
(
/*iterator*/
i, difference_type n
)
|
(1) | (since C++20) |
|
friend
constexpr
/*iterator*/
operator
+
(
difference_type n,
/*iterator*/
i
)
|
(2) | (since C++20) |
Entspricht i + = n ; return i ; .
Diese Funktionen sind für gewöhnliches unqualified oder qualified lookup nicht sichtbar und können nur durch argument-dependent lookup gefunden werden, wenn iterator eine assoziierte 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_type
:
Diese Funktionen sind für gewöhnliche unqualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch argumentabhängige Suche gefunden werden, wenn iterator eine assoziierte Klasse der Argumente ist.
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P2259R1 | C++20 |
member
iterator_category
ist immer definiert
|
nur definiert wenn
W
incrementable
erfüllt
|
| LWG 3580 | C++20 | Implementierungen von operator + und operator - schließen implizites Move aus | für implizites Move angepasst |