2016-06-30 1 views
8

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?

+1

Ceci est UB, tout peut arriver. – lorro

+2

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

+0

Avec RVO garanti (N) de C++ 17, cela peut être en quelque sorte valide. – nwp

Répondre

5

n °

Vous stockez un pointeur ballants.

Votre programme, lorsqu'il utilise ce pointeur, aura un comportement indéfini et c'est tout. Aucune optimisation pratique ne peut vous sauver de votre destin.

+2

Plus, vous renvoyez une copie et gardez un pointeur interne en permanence – KABoissonneault

+0

@KABoissonneault: Er, right :) –

+0

C'est seulement UB si le pointeur enregistré a sa valeur –