Maison >développement back-end >C++ >Pourquoi le retour d'un `std::unique_ptr` ne nécessite-t-il pas `std::move()` ?
std::unique_ptr
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 ?
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 :
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.
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!