En C , std::unique_ptr applique la sémantique de déplacement pour empêcher la propriété multiple d'objets. Cependant, il est possible de renvoyer un unique_ptr à partir d'une fonction sans appeler std::move. Ce comportement peut être attribué à une fonctionnalité du langage appelée élision de copie.
Selon la spécification du langage C (12.8 §34 et §35), une implémentation est autorisée à éluder (omettre ) opérations de copie/déplacement lorsque certains critères sont remplis. Plus précisément, l'élision de copie est autorisée dans une instruction return pour un type de retour de classe, à condition que l'expression soit le nom d'un objet automatique non volatile avec le même type cv non qualifié que le type de retour de la fonction.
Dans l'exemple de code que vous avez fourni :
unique_ptr<int> foo() { unique_ptr<int> p(new int(10)); return p; // Line 1 }
p est un objet automatique non volatile qui a le même type que le type de retour de la fonction, unique_ptr
Lorsque le compilateur rencontre la ligne 1, il effectue d'abord une résolution de surcharge pour sélectionner le constructeur pour l'opération de copie, comme si p était désigné par une rvalue. Cependant, puisque les critères d'élision sont remplis, la construction de copie est élidée et la valeur renvoyée devient un unique_ptr déplacé.
Il est important de noter que le retour par valeur devrait être le choix par défaut dans ce scénario. En présence d'élision de copie, une valeur nommée dans l'instruction return est traitée comme une rvalue. Cela signifie que même sans utiliser explicitement std::move, le unique_ptr renvoyé peut être déplacé de l'objet temporaire de la fonction.
Le retour par référence ou l'utilisation de std::make_unique sont deux alternatives viables pour éviter l'élision de copie et garantir une élision de copie explicite. transfert de propriété.
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!