std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/;
|
(1) | (nur zur Veranschaulichung*) |
| Hilfsaliasvorlagen |
||
template< class I >
using /*iota-diff-t*/ = /* see below */;
|
(2) | (nur zur Veranschaulichung*) |
| Hilfskonzepte |
||
template< class I >
concept /*decrementable*/ =
std::incrementable<I> && requires(I i)
{
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};
|
(3) | (nur zur Veranschaulichung*) |
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) | (nur zur Veranschaulichung*) |
ranges::iota_view<W, Bound>::iterator ist der Typ der Iteratoren, die von begin() und end() von ranges::iota_view<W, Bound>.- Falls
Ikein integraler Typ ist, oder falls es ein integraler Typ ist undsizeof(std::iter_difference_t<I>)größer alssizeof(I)ist, dann ist/*iota-diff-t*/<I>std::iter_difference_t<I>. - Andernfalls ist
/*iota-diff-t*/<I>ein vorzeichenbehafteter Integer-Typ mit einer Breite größer als die Breite vonI, falls ein solcher Typ existiert. - Andernfalls ist
Ieiner der breitesten integralen Typen, und/*iota-diff-t*/<I>ist ein unspezifizierter vorzeichenbehafteter ganzzahlartiger Typ mit einer Breite nicht kleiner als die Breite vonI. Es ist unspezifiziert, ob/*iota-diff-t*/<I>weakly_incrementable in diesem Fall modelliert.
operator-- für den Typ eine gemeinsame 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*/ modelliert
- random_access_iterator falls
Wmodelliertadvanceable(4), - bidirectional_iterator falls
Wmodelliertdecrementable(3), - forward_iterator falls
Wmodelliert incrementable, und - input_iterator andernfalls.
Allerdings erfüllt es nur LegacyInputIterator falls W modelliert incrementable, 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 .
Datenelemente
| Element | Beschreibung |
W value_
|
der aktuelle Wert (nur zur Darstellung Elementobjekt*) |
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 |