La norme définit-elle précisément ce que je peux faire avec un objet une fois qu'il a été déplacé? J'avais l'habitude de penser que tout ce que vous pouvez faire avec un objet déplacé est de le détruire, mais cela ne serait pas suffisant.
Par exemple, prenez le modèle de swap
fonction tel que défini dans la bibliothèque standard:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Évidemment, il doit être possible d'affecter des objets déplacés, sinon les lignes 2 et 3 échoueraient. Alors, que puis-je faire d'autre avec des objets déplacés? Où puis-je trouver exactement ces détails dans la norme?
(Au fait, pourquoi est-ce T c = std::move(a);
au lieu de la T c(std::move(a));
ligne 1?)
la source
pop_back
un fichier déplacévector
. Mais vous pouvez certainement savoir si c'est le casempty()
.pop_back
partir d'un videvector
a de toute façon un comportement indéfini, de mémoire, donc je suis à peu près sûr qu'àpop_back
partir d'un vecteur déplacé présentant un comportement non défini est cohérent.pop_back
se comporte toujours comme sur n'importe quel vecteur valide (peut-être même un vecteur vide).17.6.5.15 [lib.types.movedfrom]
Lorsqu'un objet est dans un état non spécifié, vous pouvez effectuer toute opération sur l'objet sans conditions préalables. Si vous souhaitez effectuer une opération avec des conditions préalables, vous ne pouvez pas effectuer directement cette opération car vous ne savez pas si l'état non spécifié de l'objet satisfait les conditions préalables.
Exemples d'opérations qui n'ont généralement pas de conditions préalables:
get
,empty
,size
Exemples d'opérations qui ont généralement des conditions préalables:
Cette réponse apparaît désormais au format vidéo ici: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
la source
char* buffer;
etint length;
membres, mon constructeur / affectation de déplacement doit échanger (ou définir) la valeur des deux? Ou serait-ce OK, si la longueur n'était pas spécifiée (ce qui signifie queempty
etsize
renvoyer des valeurs sans signification)?