Que puis-je faire avec un déplacé-de l'objet?
La norme de définir précisément ce que je peux faire avec un objet une fois qu'il a été déplacé à partir? J'ai l'habitude de penser que tout ce que vous pouvez faire avec un déplacé-de l'objet est de faire détruire, mais ce ne serait pas suffisant.
Par exemple, prenons le modèle de fonction swap
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'assigner à déplacé-à partir d'objets, sinon les lignes 2 et 3 serait un échec. Alors quoi d'autre puis-je faire avec déplacés-à partir d'objets? Exactement où puis-je trouver ces informations dans la norme?
(Au fait, pourquoi est-il T c = std::move(a);
au lieu de T c(std::move(a));
dans la ligne 1?)
Vous devez vous connecter pour publier un commentaire.
Déplacé-de les objets existent dans un nombre indéterminé, mais valide, de l'état. Cela suggère que, bien que l'objet peut ne pas être capable de faire bien plus, l'ensemble de ses fonctions de membre doit encore présenter de comportement défini — y compris
operator=
— et de tous ses membres dans un état - et il nécessite toujours la destruction. La Norme ne donne pas de définitions précises, car il devrait être unique pour chaque type défini par l'utilisateur, mais vous pourriez être en mesure de trouver les spécifications pour types Standard. Certains, comme les conteneurs sont relativement évidente — ils suffit de déplacer leur contenu autour de et un conteneur vide est bien définie de l'état valide. Les Primitives de ne pas modifier le déplacé-de l'objet.Note de côté: je crois que c'est
T c = std::move(a)
de sorte que si le constructeur de déplacement (ou de constructeur de copie si aucun mouvement n'est fournie) est explicite, la fonction échouera.pop_back
un déplacé-devector
. Mais vous pouvez certainement trouver si il estempty()
.pop_back
à partir d'un videvector
a un comportement indéterminé de toute façon, à partir de la mémoire, donc je suis assez sûr quepop_back
à partir d'un déplacé vecteur présentant un comportement indéterminé est cohérent.pop_back
se comporte encore comme sur tout vecteur (il peut même être un vecteur vide).17.6.5.15 [lib.les types.movedfrom]
Lorsqu'un objet est dans un quelconque état, vous pouvez effectuer toute opération sur l'objet qui n'a pas de conditions préalables. Si une opération est avec des conditions préalables que vous souhaitez effectuer, vous ne pouvez pas directement effectuer cette opération car vous ne savez pas si l'une quelconque état de l'objet remplit les conditions préalables.
Exemples d'opérations qui généralement n'ont pas de conditions préalables:
get
,empty
,size
Exemples d'opérations qui généralement n'ont préalables:
Cette réponse apparaît maintenant dans format vidéo ici: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
char* buffer;
etint length;
membres, puis mon déménagement constructeur/cession doit swap (ou l'ensemble) de la valeur de deux? Ou serait-il OK, si la durée est indéterminée (ce qui signifie queempty
etsize
retour de sens des valeurs)?std::vector
et appelstd::sort
sur ce vecteur. Le code résultant peut utiliser déplacement sémantique, y compris l'attribution d'un déplacé-de l'objet lorsqu'il est compilé en C++0X mode. C'est d'ailleurs pas le seul changement incompatible... même justestd::vector<X> v(n);
a une autre sémantique dans C++0X.