Maison > Article > développement back-end > Pourquoi le constructeur de déplacement C 11 n'est-il pas appelé lors de l'instanciation d'un objet avec un autre objet ?
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 :
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!