Alors qu'il pourrait être raisonnable de supposer que, iterator
s sont toujours valables après un move
, je ne pense pas que le Standard assure de fait cette. Par conséquent, les itérateurs sont dans un état indéfini après l' move
.
Il n'y a pas de référence que je peux trouver dans la Norme qui précise que les itérateurs qui existait avant l' move
sont toujours valables après l' move
.
Sur la surface, il semble tout à fait raisonnable de supposer que l' iterator
est généralement mis en œuvre comme des pointeurs dans la séquence contrôlée. Si c'est le cas, alors les itérateurs reste valide après l' move
.
Mais la mise en œuvre d'un iterator
est mise en œuvre définies. Sens, tant que l' iterator
sur une plate-forme répond aux exigences définies par la Norme, il peut être mis en œuvre de quelque manière que ce soit. Il pourrait, en théorie, être mis en œuvre comme une combinaison d'un pointeur de retour à l' vector
classe avec un index. Si c'est le cas, alors les itérateurs deviendrait invalide après l' move
.
Si oui ou non un iterator
est effectivement mise en œuvre de cette façon n'est pas pertinent. Il pourrait être mise en œuvre de cette façon, donc, sans une garantie spécifique de la Norme que le post-move
itérateurs sont encore valide, vous ne pouvez pas supposer qu'ils sont. N'oubliez pas également qu'il y est une telle garantie pour les itérateurs après un swap
. Cela a été expressément précisé à partir de la Norme précédente. C'était peut-être simplement d'un oubli de la Std comité pour ne pas faire une précision similaire pour les itérateurs après un move
, mais en tout cas il n'y a aucune garantie.
Par conséquent, le long et le court de il est, vous ne pouvez pas assumer votre itérateurs sont toujours bien après une move
.
EDIT:
23.2.1/11 dans le Projet de n3242 stipule que:
À moins d'indication contraire (soit explicitement, soit par la définition d'un
fonction en ce qui concerne les autres fonctions), invoquant un conteneur membre
la fonction ou du passage d'un conteneur comme argument à une fonction de la bibliothèque
n'invalidera pas les itérateurs, ou modifier les valeurs, les objets
dans ce conteneur.
Cela pourrait conduire à la conclusion que les itérateurs sont valables après un move
, mais je suis en désaccord. Dans votre exemple de code, a_iter
a été un itérateur à l' vector
a
. Après l' move
, ce conteneur, a
a certainement été changé. Ma conclusion est la clause ci-dessus ne s'applique pas dans ce cas.