4
votes

La variable déplacée est-elle valide pour être utilisée après std :: move?

J'ai du mal à comprendre si je std :: move POD d'une variable à une autre, la variable source est-elle toujours valide à utiliser ou agit-elle comme un pointeur suspendu? indique-t-il toujours la mémoire de la pile?

par exemple:

int a = 5;
int b = std::move(a) // b owns a resources now

a = 10 // is this valid? does it have memory address?
std::cout << a; // prints 10 obviously valid?


0 commentaires

3 Réponses :


3
votes

Lorsque vous utilisez std :: move sur un type POD , rien de spécial ne se produit, il ne fait qu'une simple copie et les deux source et destination sont toujours utilisables.


0 commentaires

3
votes

std :: move ne fait rien à un POD.

int a = 5;
int b = std::move(a);

a est toujours bon après cela.

Pour les types non-POD, l'objet déplacé peut être valide pour certaines opérations et invalide pour d'autres opérations - tout dépend de ce que fait le constructeur de déplacement ou l'opérateur d'affectation de déplacement.


5 commentaires

Vous devriez peut-être étendre la réponse pour inclure le comportement des types non-POD.


@CinCout, le comportement des types non-POD dépend tellement du constructeur de déplacement, il est difficile de dire quoi que ce soit d'utile à leur sujet.


est-ce donc le seul but de std :: move pour invoquer les affectations de déplacement et les constructeurs de déplacement? un autre cas à côté de ces 2 concepts?


La sémantique @zebanovich Move n'est en aucun cas limitée. Toute fonction peut plus de n'importe quel argument.


@zebanovich, c'est tout ce à quoi je peux penser.



6
votes

Notez que std :: move ne déplace pas son argument, il le transforme simplement en une référence rvalue. Ce qui déplace réellement un objet est un constructeur ou un opérateur d'affectation qui accepte la référence rvalue.

Mais int est un type intégré et n'a pas un tel constructeur ou operator = , donc en appliquant std :: move à int ne le fera pas être déplacé.

En mettant de côté les types intégrés, le standard C ++ dit qu'un objet déplacé doit être dans un état valide mais non spécifié. Habituellement, cela signifie que nous ne pouvons pas utiliser sa valeur, mais que nous pouvons la réaffecter.


1 commentaires

Ce dernier bit est également une exigence pour les types std: vous pouvez appeler des fonctions sans conditions préalables sans problème (bien que l'appel de la taille sur un vecteur déplacé ne soit toujours pas spécifié, même si cela ne provoquera pas de comportement indéfini). Les pointeurs intelligents déplacés de std sont également définis sur nullptr, qui est une autre fonctionnalité supplémentaire définie dans la norme.