Maison >développement back-end >C++ >Pourquoi le retour d'un `std::unique_ptr` ne nécessite-t-il pas `std::move()` ?

Pourquoi le retour d'un `std::unique_ptr` ne nécessite-t-il pas `std::move()` ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 18:03:10415parcourir

Why Does Returning a `std::unique_ptr` Not Require `std::move()`?

Pourquoi renvoyer un std::unique_ptr sans std::move() ?

std::unique_ptr empêche la construction de copies et utilise à la place une sémantique de déplacement. Cependant, il est possible de renvoyer un unique_ptr à partir d'une fonction sans utiliser explicitement std::move().

Considérez l'extrait de code suivant :

unique_ptr<int> foo()
{
  unique_ptr<int> p(new int(10));

  return p; // Line 1
}

int main()
{
  unique_ptr<int> p = foo();
  cout << *p << endl;
}

La ligne 1 renvoie un unique_ptr sans std::move(). Étonnamment, le code se compile et fonctionne comme prévu, alors comment est-ce possible sans invoquer le constructeur de copie ?

Exploiter la spécification du langage

La clé pour comprendre ce comportement réside dans la spécification du langage C. Plus précisément, les sections 12.8 §34 et §35 décrivent l'élision de copie :

Lorsque certains critères sont remplis, une implémentation est autorisée à omettre la construction de copie/déplacement d'un objet de classe [...].

Dans ce cas, l'élision de copie est autorisée car :

  • La valeur de retour est une valeur temporaire objet.
  • L'objet temporaire a le même type que le type de retour de la fonction.
Lorsque les critères d'élision d'une opération de copie sont remplis et que l'objet à copier est désigné par une résolution de surcharge lvalue pour sélectionner le constructeur pour la copie est d'abord effectuée comme si l'objet était désigné par une rvalue.

Cela implique que bien que la valeur de retour soit un objet nommé (un lvalue), la résolution de surcharge la considère toujours comme une rvalue. Ainsi, le constructeur de déplacement n'est pas invoqué et le unique_ptr renvoyé est construit avec succès.

Conclusion

La possibilité de renvoyer un unique_ptr sans std::move() est une fonctionnalité subtile du C spécification du langage. Il n'est pas nécessaire d'utiliser explicitement std::move() lors du renvoi d'un unique_ptr à partir d'une fonction, tant que les conditions d'élision de copie sont remplies. Cela peut contribuer à améliorer la clarté du code et à réduire les opérations de déplacement inutiles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn