Maison > développement back-end > C++ > Pourquoi la règle de déplacement implicite préfère-t-elle un constructeur de copie à un constructeur de déplacement lorsque le constructeur de déplacement n'est pas disponible ?

Pourquoi la règle de déplacement implicite préfère-t-elle un constructeur de copie à un constructeur de déplacement lorsque le constructeur de déplacement n'est pas disponible ?

Mary-Kate Olsen
Libérer: 2024-11-05 10:36:02
original
997 Les gens l'ont consulté

Why Does the Implicit Move Rule Prefer a Copy Constructor Over a Move Constructor When the Move Constructor is Unavailable?

Renvoi d'un objet de classe par valeur avec une règle de déplacement implicite

Lors du renvoi d'un objet d'une classe par valeur à partir d'une fonction, le déplacement implicite la règle entre en jeu. Cette règle détermine le constructeur à utiliser pour initialiser l'objet renvoyé. En règle générale, le constructeur de déplacement est préféré si l'objet est considéré comme une valeur x (une expression qui peut être déplacée).

Dans votre Exemple 1, la variable que j'ai déclarée dans Some_thing() La fonction est une valeur X car elle est déclarée dans une portée locale et est considérée comme éligible au déplacement. Par conséquent, le constructeur de déplacement test(test&& s) est invoqué, comme indiqué dans le résultat.

Cependant, dans Exemple 2, vous avez supprimé le constructeur de déplacement et modifié le constructeur de copie pour qu'il soit test (test&z). Ce changement a entraîné la sortie affichant l'appel au constructeur de copie test(test& z) au lieu du constructeur de déplacement, ce qui était attendu en raison de la règle de déplacement implicite.

Ce comportement apparemment contradictoire se produit parce que i est toujours considéré une valeur x, mais le compilateur considère désormais également le constructeur de copie "normal" comme viable. La règle de déplacement implicite tente d'abord d'utiliser le constructeur de déplacement, mais comme il n'y en a pas, elle utilise le constructeur de copie.

Pour imposer explicitement l'utilisation d'un constructeur de déplacement, vous pouvez supprimer le constructeur de copie. , comme le montre l'Exemple 3. Cela empêche le compilateur de considérer le constructeur de copie comme une option, et le constructeur de déplacement sera utilisé même s'il est marqué comme const (ce qui empêche normalement le déplacement).

L'exemple 4 démontre que un objet const peut toujours être déplacé si le constructeur de déplacement est disponible et que l'opération de déplacement est nosauf. Dans ce cas, l'objet temporaire créé lors de l'initialisation de u est déplacé vers r, entraînant l'appel au constructeur de déplacement.

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