Maison > développement back-end > C++ > Comment puis-je renvoyer un « std :: unique_ptr » sans utiliser « std :: move » ?

Comment puis-je renvoyer un « std :: unique_ptr » sans utiliser « std :: move » ?

Mary-Kate Olsen
Libérer: 2024-12-22 05:01:09
original
1017 Les gens l'ont consulté

How Can I Return a `std::unique_ptr` Without Using `std::move`?

Retour de std::unique_ptr sans std::move : comment est-ce possible ?

Malgré l'interdiction de construction de copies dans std:: unique_ptr, il est possible de renvoyer un std::unique_ptr à partir d'une fonction sans utiliser std::move. Cette contradiction apparente est enracinée dans une exception spécifique autorisée par la spécification du langage C.

L'exception : l'élision de copie

C permet l'élision de copie dans des circonstances spécifiques, telles que définies dans 12.8 §34 et §35. Un tel cas est celui où un objet automatique non volatile avec le même type cv non qualifié que le type de retour de la fonction est renvoyé. Dans ce scénario, le compilateur est autorisé à ignorer le processus de construction de copie. Cette élision est appliquée à la fois aux copies et aux déplacements.

L'implémentation de l'élision de copie

Lorsque l'élision de copie est utilisée dans une instruction return, le compilateur considère d'abord l'objet comme une rvalue, même s'il s'agit d'une lvalue, à des fins de résolution de surcharge. Par conséquent, si un constructeur de déplacement est disponible, il est sélectionné, mais aucune opération de déplacement réelle n'est effectuée. Cela se traduit par un appel de constructeur de déplacement vide qui agit comme un espace réservé et maintient la sémantique de propriété du pointeur unique.

Exemple

Le code suivant démontre le phénomène :

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

  return p; // Line 1, copy elision applied
}

int main()
{
  unique_ptr<int> p = foo();

  cout << *p << endl;
  return 0;
}
Copier après la connexion

À la ligne 1, le unique_ptr est traité comme une valeur r lors de la résolution de surcharge. Puisqu'un constructeur de déplacement est disponible, il est sélectionné. Cependant, la valeur de retour réelle est l'objet automatique non volatile p, et non une valeur déplacée. Le compilateur élimine la construction copier/déplacer, permettant le retour d'un unique_ptr sans utiliser explicitement std::move.

Conclusion

Cette exception à l'interdiction du constructeur de copie est spécifiquement autorisée par la spécification du langage C pour faciliter des instructions de retour efficaces et concises. Cependant, il est important de noter que l’élision de copie est une optimisation que le compilateur peut effectuer ou non. En tant que tel, il est généralement recommandé d'utiliser explicitement std::move dans les instructions return pour garantir le comportement souhaité.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal