Maison > développement back-end > C++ > Pourquoi le constructeur de déplacement C 11 n'est-il pas appelé lors de l'instanciation d'un objet avec un autre objet ?

Pourquoi le constructeur de déplacement C 11 n'est-il pas appelé lors de l'instanciation d'un objet avec un autre objet ?

Linda Hamilton
Libérer: 2024-11-05 08:20:02
original
753 Les gens l'ont consulté

Why isn't the C  11 move constructor called when instantiating an object with another object?

Constructeur de déplacement C 11 non appelé, constructeur par défaut préféré

Question :

En C 11, lors de l'instanciation d'un objet via un autre objet, pourquoi le constructeur de déplacement ne peut-il pas être appelé alors qu'il devrait l'être ?

Réponse :

Lors de l'instanciation, le compilateur peut occasionnellement appliquer une technique connue sous le nom d’élision de copie. L'élision de copie permet la construction directe d'un objet temporaire dans la cible dans laquelle il serait copié ou déplacé, en contournant la paire constructeur/destructeur de copie ou de déplacement.

La norme autorise l'élision de copie dans les circonstances suivantes :

  • Return Statements : Les objets automatiques non volatils avec le même type cv non qualifié que le type de retour de la fonction peuvent être construits directement dans la valeur de retour.
  • Expressions de lancement : Les objets automatiques non volatils dont la portée ne s'étend pas au-delà du bloc try le plus interne peuvent être construits directement dans l'objet d'exception.
  • Objets temporaires : Objets temporaires qui qui n'ont pas été liés à une référence peuvent être construits directement dans des objets avec le même type cv non qualifié.
  • Gestionnaires d'exception : Les déclarations d'exception d'un gestionnaire d'exception peuvent être traitées comme des alias pour l'exception objet, en omettant l'opération de copie ou de déplacement.

Dans l'exemple donné, lors de l'instanciation de z avec X("test"), l'élision de copie se produit car elle est considérée comme un objet temporaire qui n'a pas été lié à une référence. Par conséquent, il est construit directement dans z, en contournant le constructeur de déplacement et en construisant z en utilisant le constructeur par défaut à la place.

Appeler explicitement move(X("test")) empêche l'élision de copie et force l'utilisation du constructeur de déplacement , comme observé dans la sortie modifiée.

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