Problème :
Pointeurs uniques (std::unique_ptr) en C adhérer strictement à la sémantique de déplacement, interdisant la construction de copies. Cependant, il est possible de renvoyer un pointeur unique par valeur à partir d'une fonction et d'attribuer la valeur renvoyée sans appeler le constructeur de copie. Cette action soulève des questions sur la manière dont ce comportement apparemment paradoxal est autorisé.
Question :
Y a-t-il une clause spécifique dans la spécification du langage qui autorise cette exception ?
Réponse :
Oui. Comme indiqué dans les §34 et §35 du C 11, le compilateur est autorisé à effectuer une « élision de copie » dans certains scénarios. Voici l'extrait pertinent :
When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object [...]. This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type [...].
Essentiellement, cela signifie que si la valeur de retour est un objet automatique non volatile qui correspond au type de retour, le compilateur peut ignorer la construction de copie/déplacement.
De plus, selon la spécification :
When the criteria for elision of a copy operation are met and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue.
Cela implique que lors du retour d'une lvalue (objet nommé) par déplacement, le compilateur tentera de résoudre la sélection du constructeur comme s'il s'agissait d'une valeur r (objet temporaire).
Détails d'implémentation :
Cette optimisation est implémentée via des techniques de compilateur. Dans les cas où l'élision de copie est autorisée, le compilateur crée directement l'objet renvoyé dans l'emplacement mémoire désigné sans subir de construction de copie. Cette approche garantit que l'objet renvoyé est unique et évite la création et la destruction inutiles d'objets.
Il est important de noter que ce comportement est spécifique à C 0x, et dans les versions précédentes de C , renvoyer un pointeur unique par valeur entraînent généralement un comportement indéfini ou des erreurs du compilateur.
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!