Un std::list
stocke ses éléments dans des noeuds. Lorsque vous ajoutez un élément, un nouveau nœud est alloué, puis l'élément est stocké dans le nœud (via un appel à std::allocator_traits<A>::construct
, qui effectue généralement un placement-new pour construire l'objet à l'intérieur du nœud), puis le nœud est finalement ajouté à la liste, en mettant à jour les pointeurs du nouveau noeud et du (des) noeud (s) adjacent (s) pour le lier dans la liste. Si une exception bad_alloc
est levée, il ne peut s'agir que de l'allocation du nouveau nœud ou de la construction de l'élément à l'intérieur du nœud (car la mise à jour des pointeurs ne lancera rien). Si l'exception se produit lors de l'allocation de l'objet nœud, il est très probable que l'objet n'a pas encore été déplacé, car aucune tentative de déplacement-construction d'un nouvel élément n'a été effectuée (vous ne pouvez pas le faire tant que vous avoir un noeud pour le construire en!). Il n'y a aucune garantie que le conteneur ne crée pas de variables intermédiaires avant de construire l'élément final à l'intérieur du nœud, mais ce serait une implémentation de mauvaise qualité, car il n'y a aucune raison de le faire.
Si la classe a un constructeur de mouvement non-lanceur, alors vous savez que l'exception doit provenir de l'allocation de nœud. Sinon, si l'exception provient de la construction de l'élément, alors l'état de l'argument rvalue sera dicté par les garanties de sécurité d'exception de la classe en question. Donc, en résumé, si l'implémentation std::list
est mauvaise, ou si l'objet inséré peut être lancé pendant la construction du mouvement et n'a pas la forte garantie de sécurité, alors l'argument rvalue peut être laissé dans un état déplacé . Mais sinon, vous devriez pouvoir vous en tenir à ce que vous ne soyez pas modifié.
Je ne pense pas que ce déplacement rend l'objet invalide. – Slava
Ok, je n'ai pas précisé - supposons que SomeClass a des champs qui - après avoir appelé std :: move() sur son objet - serait invalide (c'est-à-dire des pointeurs). – PookyFan
Je ne suis pas sûr de ce que vous voulez dire par des pointeurs "invalide". Je pense qu'ils seront dans un état prévisible (je veux dire des pointeurs intelligents bien sûr), donc si vous les vérifiez avant de déréférencer, vous devriez aller bien. – Slava