std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/;
|
(1) | (exposition uniquement*) |
| Modèles d'alias auxiliaires |
||
template< class I >
using /*iota-diff-t*/ = /* see below */;
|
(2) | (exposition uniquement*) |
| Concepts auxiliaires |
||
template< class I >
concept /*decrementable*/ =
std::incrementable<I> && requires(I i)
{
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};
|
(3) | (exposition uniquement*) |
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) | (exposition uniquement*) |
ranges::iota_view<W, Bound>::iterator est le type des itérateurs retournés par begin() et end() de ranges::iota_view<W, Bound>.- Si
In'est pas un type intégral, ou si c'est un type intégral et quesizeof(std::iter_difference_t<I>)est supérieur àsizeof(I), alors/*iota-diff-t*/<I>eststd::iter_difference_t<I>. - Sinon,
/*iota-diff-t*/<I>est un type entier signé de largeur supérieure à la largeur deIsi un tel type existe. - Sinon,
Iest l'un des types intégraux les plus larges, et/*iota-diff-t*/<I>est un type signed-integer-like type non spécifié de largeur au moins égale à la largeur deI. Il n'est pas spécifié si/*iota-diff-t*/<I>modélise weakly_incrementable dans ce cas.
operator-- pour le type ont une signification commune.decrementable et totally_ordered, et que operator+=, operator-=, operator+ et operator- parmi le type et son type différent ont une signification commune./*iterator*/ modélise
- random_access_iterator si
Wmodéliseadvanceable(4), - bidirectional_iterator si
Wmodélisedecrementable(3), - forward_iterator si
Wmodélise incrementable, et - input_iterator sinon.
Cependant, il ne satisfait que LegacyInputIterator si W modélise incrementable, et ne satisfait pas LegacyInputIterator sinon.
Exigences sémantiques
I
modélise
decrementable
seulement si
I
satisfait
decrementable
et tous les concepts qu'il subsume sont modélisés, et étant donné des objets égaux
a
et
b
de type
I
:
-
Si
a
et
b
sont dans le domaine des opérateurs pré- et post-
operator
--
(c'est-à-dire qu'ils sont décrémentables), alors toutes les expressions suivantes sont
true
:
- std:: addressof ( -- a ) == std:: addressof ( a ) ,
- bool ( a -- == b ) ,
- bool ( ( ( void ) a -- , a ) == -- b ) ,
- bool ( ++ ( -- a ) == b ) .
- Si a et b sont dans le domaine des opérateurs pré- et post- operator ++ (c'est-à-dire qu'ils sont incrémentables), alors bool ( -- ( ++ a ) == b ) est 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
-
objets
a
et
b
de type
Iet -
valeur
n
de type
D,
tel que b soit accessible depuis a après n applications de ++ a , toutes les conditions suivantes sont satisfaites :
- ( a + = n ) est égal à b .
- std:: addressof ( a + = n ) est égal à std:: addressof ( a ) .
- I ( a + n ) est égal à ( a + = n ) .
-
Pour deux valeurs positives quelconques
x
et
y
de type
D, si I ( a + D ( x + y ) ) est bien défini, alors I ( a + D ( x + y ) ) est égal à I ( I ( a + x ) + y ) . - I ( a + D ( 0 ) ) est égal à a .
- Si I ( a + D ( n - 1 ) ) est bien défini, alors I ( a + n ) est égal à [ ] ( I c ) { return ++ c ; } ( I ( a + D ( n - 1 ) ) ) .
- ( b + = - n ) est égal à a .
- ( b - = n ) est égal à a .
- std:: addressof ( b - = n ) est égal à std:: addressof ( b ) .
- I ( b - n ) est égal à ( b - = n ) .
- D ( b - a ) est égal à n .
- D ( a - b ) est égal à D ( - n ) .
- bool ( a <= b ) est true .
Types imbriqués
| Type | Définition |
iterator_concept
|
une balise d'itérateur , voir ci-dessous |
iterator_category
(présent uniquement si
W
modélise
incrementable
et
/*iota-diff-t*/ < W > est un type entier) |
std::input_iterator_tag |
value_type
|
W
|
difference_type
|
/*iota-diff-t*/ < W > |
Détermination du concept d'itérateur
iterator_concept
est défini comme suit :
-
Si
Wmodéliseadvanceable,iterator_conceptdénote std::random_access_iterator_tag . -
Sinon, si
Wmodélisedecrementable,iterator_conceptdénote std::bidirectional_iterator_tag . -
Sinon, si
Wmodéliseincrementable,iterator_conceptdénote std::forward_iterator_tag . -
Sinon,
iterator_conceptdénote std::input_iterator_tag .
Membres de données
| Membre | Description |
W value_
|
la valeur actuelle (objet membre d'exposition uniquement*) |
Fonctions membres
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 > ) ; |
(depuis C++20) | |
Retourne
value_
.
Exemple
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6, 9).begin()}; const int& r = *it; // se lie avec un temporaire assert(*it == 6 and r == 6); ++it; assert(*it == 7 and r == 6); }
std::ranges::iota_view:: iterator :: operator++
|
constexpr
/*iterator*/
&
operator
++
(
)
;
|
(1) | (depuis C++20) |
|
constexpr
void
operator
++
(
int
)
;
|
(2) | (depuis C++20) |
|
constexpr
/*iterator*/
operator
++
(
int
)
requires
std::
incrementable
<
W
>
;
|
(3) | (depuis C++20) |
value_
;
return
*
this
;
.
value_
;
.
value_
;
return
tmp
;
.
Exemple
#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) | (depuis C++20) |
|
constexpr
/*iterator*/
operator
--
(
int
)
requires
/*decrementable*/
<
W
>
;
|
(2) | (depuis C++20) |
value_
;
return
*
this
;
.
value_
;
return
tmp
;
.
Exemple
#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 > ; |
(depuis C++20) | |
Met à jour
value_
et retourne
*
this
:
-
Si
West un type similaire à un entier non signé : -
Sinon, effectue
value_+ = n .
Exemple
#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 > ; |
(depuis C++20) | |
Met à jour
value_
et retourne
*
this
:
-
Si
West un type similaire à un entier non signé : -
Sinon, effectue
value_- = n .
Exemple
#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 > ; |
(depuis C++20) | |
Retourne
W
(
value_
+
n
)
.
Exemple
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it + 3) == 9); }
Fonctions non membres
opérateur==, <, >, <=, >=, <=> (std::ranges::iota_view:: iterator )
|
friend
constexpr
bool
operator
==
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(1) | (depuis C++20) |
|
friend
constexpr
bool
operator
<
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(2) | (depuis C++20) |
|
friend
constexpr
bool
operator
>
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(3) | (depuis C++20) |
|
friend
constexpr
bool
operator
<=
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(4) | (depuis C++20) |
|
friend
constexpr
bool
operator
>=
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(5) | (depuis C++20) |
|
friend
constexpr
bool
operator
<=>
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(6) | (depuis C++20) |
L'opérateur
!=
est
synthétisé
à partir de
operator==
.
Ces fonctions ne sont pas visibles par la recherche non qualifiée ou qualifiée ordinaire, et ne peuvent être trouvées que par la recherche dépendante des arguments lorsque iterator est une classe associée des arguments.
operator+ (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
+
(
/*iterator*/
i, difference_type n
)
|
(1) | (depuis C++20) |
|
friend
constexpr
/*iterator*/
operator
+
(
difference_type n,
/*iterator*/
i
)
|
(2) | (depuis C++20) |
Équivalent à i + = n ; return i ; .
Ces fonctions ne sont pas visibles par la recherche non qualifiée ordinaire ou la recherche qualifiée , et ne peuvent être trouvées que par la recherche dépendante des arguments lorsque iterator est une classe associée des arguments.
operator- (std::ranges::iota_view:: iterator )
|
friend
constexpr
/*iterator*/
operator
-
(
/*iterator*/
i, difference_type n
)
|
(1) | (depuis C++20) |
|
friend
constexpr
difference_type operator
-
(
const
/*iterator*/
&
x,
const
/*iterator*/
&
y
)
|
(2) | (depuis C++20) |
D
le type
difference_type
:
Ces fonctions ne sont pas visibles par la recherche non qualifiée ou recherche qualifiée ordinaire, et ne peuvent être trouvées que par la recherche dépendante des arguments lorsque iterator est une classe associée des arguments.
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| P2259R1 | C++20 |
le membre
iterator_category
est toujours défini
|
défini uniquement si
W
satisfait
incrementable
|
| LWG 3580 | C++20 | les corps de operator + et operator - empêchent le déplacement implicite | rendus compatibles avec le déplacement implicite |