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!