Retour de std::unique_ptr sans std::move : comment est-ce possible ?
Malgré l'interdiction de construction de copies dans std:: unique_ptr
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; }
À la ligne 1, le unique_ptr
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!