C++ named requirements: LegacyForwardIterator
Un LegacyForwardIterator est un LegacyIterator qui peut lire les données de l'élément pointé.
Contrairement à LegacyInputIterator et LegacyOutputIterator , il peut être utilisé dans des algorithmes multipasses.
Si un LegacyForwardIterator it provient d'un Container , alors le type de valeur de it est le même que celui du conteneur, donc le déréférencement ( * it ) donne le type de valeur du conteneur.
Table des matières |
Exigences
| Type | Définition |
X
|
Un type d'itérateur avant |
T
|
Le
type de valeur
de
X
(c'est-à-dire
std::
iterator_traits
<
X
>
::
value_type
)
|
Ref
|
std:: iterator_traits < X > :: reference |
| Valeur | Définition |
| i , j |
Valeurs de type
X
ou
const
X
|
| r |
Une valeur de type
X&
|
X
satisfait
LegacyForwardIterator
si toutes les conditions suivantes sont satisfaites :
-
Xsatisfait LegacyInputIterator . -
Xsatisfait DefaultConstructible . -
Si
Xest un itérateur mutable ,Refest une référence versT. -
Si
Xest un itérateur constant,Refest une référence vers const T . -
Les objets du type
Xfournissent la garantie multi-pass . - Si i et j sont égaux, alors soit i et j sont tous deux déréférençables , soit aucun ne l'est.
- Si i et j sont tous deux déréférençables, alors i == j si et seulement si * i et * j sont liés au même objet.
- Les expressions suivantes doivent être valides et avoir leurs effets spécifiés :
| Expression | Type | Effets |
|---|---|---|
| r ++ | convertible en const X & |
Équivalent à
X x
=
r
;
++ r ; return x ; . |
| * i ++ |
Ref
|
Domaine d'égalité
Le domaine de == pour les itérateurs forward est celui des itérateurs sur la même séquence sous-jacente .
|
Cependant, les itérateurs forward initialisés par valeur peuvent être comparés, et doivent être égaux à d'autres itérateurs initialisés par valeur du même type. En d'autres termes, les itérateurs forward initialisés par valeur se comportent comme s'ils référençaient au-delà de la fin de la même séquence vide. |
(depuis C++14) |
Garantie multi-passes
Deux itérateurs déréférençables
a
et
b
de type
X
offrent la
garantie multi-pass
si toutes les conditions suivantes sont satisfaites :
- a == b implique ++ a == ++ b .
- L'une des conditions suivantes est satisfaite :
-
-
Xest un type pointeur. - L'expression ( void ) ++ X ( a ) , * a est équivalente à l'expression * a .
-
ConceptPour la définition de std::iterator_traits , le concept suivant (à titre d'exposition uniquement) est défini.
où le concept à titre d'exposition uniquement
|
(depuis C++20) |
Notes
Contrairement au concept std::forward_iterator , les exigences LegacyForwardIterator nécessitent que le déréférencement retourne une référence.
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 | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
|
LWG 1212
( N3066 ) |
C++98 |
le type de
*
i
++
ne correspondait pas au type de
* i -- requis par LegacyBidirectionalIterator |
modifié le
type en
Ref
|
|
LWG 1311
( N3066 ) |
C++98 |
«
a
==
b
implique
++
a
==
++
b
» seul
n'offrait pas la garantie multipass [1] |
requiert également «
a
==
b
implique ++ a ! = b » [2] |
| LWG 3798 | C++20 |
__LegacyForwardIterator
requérait
std:: iter_reference_t < It > soit un type référence lvalue |
autorise également les types
référence rvalue |
- ↑ Dans le scénario où a et b utilisent le même itérateur sous-jacent, l'évaluation de l'expression ++ a == ++ b incrémente effectivement le conteneur sous-jacent deux fois, mais le résultat reste true .
- ↑ Formellement, cela implique également ++ b ! = a .
Voir aussi
|
(C++20)
|
spécifie qu'un
input_iterator
est un itérateur avant, prenant en charge la comparaison d'égalité et le multi-passage
(concept) |
| Bibliothèque d'itérateurs | fournit des définitions pour les itérateurs, les traits d'itérateurs, les adaptateurs et les fonctions utilitaires |