std::unique_ptr p1(new int); std::unique_ptr p2(new int); p2=p1;
Il semble ici que p1 n’est plus “unique” puisque p2 s’y réfère aussi
C’est du c ++ légal? Est-ce que unique_ptr a copy_semantics? Si non, et s’il n’a que la sémantique de déplacement, est-ce que p1 est défini sur NULL après l’affecter à p2?
MODIFIER:
ok donc la version correcte est
p2=std::move(p1)
Selon cela, après cet atsortingbut, p1 n’est pas valide? Et la différence avec auto_ptr est ici? il est plus sûr de spécifier explicitement le transfert de propriété qu’implicitement comme c’est le cas avec auto_ptr
std :: unique_ptr est non assignable et non copiable. Vous devez utiliser std :: move ();
alors
p1 = std::move(p2);
Jetez un coup d’œil ici pour plus d’informations.
Voici un article que j’ai écrit qui répond à vos questions. J’ai initialement écrit cet article pour présenter une émulation de unique_ptr. Cependant, vous pouvez ignorer les premiers paragraphes traitant de l’émulation et commencer à lire “Exemples de base”.
http://howardhinnant.github.io/unique_ptr03.html
Modifier:
J’ai eu du mal à distiller l’article lié ci-dessus à quelque chose d’assez petit pour faire une réponse pratique dans ce format. Cependant voici mon meilleur coup:
La raison: la sécurité dans le code générique. On ne peut pas vraiment faire des copies de
auto_ptr
ouunique_ptr
. Considérer:template
void foo(T t) { T copy_of_t = t; // line 4 assert(copy_of_t == t); } Il n’est pas inhabituel que le code générique ressemble à
foo
ci-dessus. L’assert
n’est probablement pas vraiment là, mais l’hypothèse selon laquelle l’assert
tiendrait souvent est là, implicitement . En effet, une implémentation populaire destd::sort
avait exactement cette logique en 1996, ce qui est exactement ce qui a motivé la secondeauto_ptr
(ce qui a aidé, mais n’a pas complètement résolu le problème).
Par p2=p1
, p2=p1
est une erreur de compilation.