Maison >développement back-end >C++ >Puis-je renvoyer un `std::unique_ptr` Sans `std::move` en C ?

Puis-je renvoyer un `std::unique_ptr` Sans `std::move` en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 02:42:09465parcourir

Can I Return a `std::unique_ptr` Without `std::move` in C  ?

Renvoyer un std::unique_ptr sans std::move

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.

É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.

Elision in unique_ptr Return Statements

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. Par conséquent, le compilateur est autorisé à éluder la construction de copie de p.

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é.

Implications pour les meilleures pratiques

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!

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