Si j'écris une méthode usine qui instancie localement un objet puis retourne par valeur, avec l'intention de tirer parti de NRVO (selon certaines des réponses ici: c++11 Return value optimization or move?), un pointeur/référence à l'objet local point à l'objet auquel est affectée la valeur de retour de la méthode?Stockage d'un pointeur vers un objet renvoyé avec NRVO
Object ObjectBuilder::BuildObject(void)
{
Object obj;
//this->ObjectReference = obj; //Disregard this
//OR
this->ObjectPtr = &obj;
return obj;
}
En utilisation:
ObjectBuilder builder;
Object newObject = builder.BuildObject();
Est-ce que builder.ObjectPtr reportez-vous à newObject?
Ceci est UB, tout peut arriver. – lorro
Cela ressemble à un ticket gratuit pour UndefinedBehavior Land, même si nous considérons l'ellision de copie garantie par C++ 17. Même si votre fonction fait ce que vous pensez qu'elle ferait, comment garantissez-vous que l'appelant maintiendra la durée de vie de l'objet aussi longtemps que votre 'ObjectBuilder' l'accèdera? – KABoissonneault
Avec RVO garanti (N) de C++ 17, cela peut être en quelque sorte valide. – nwp