2017-09-12 2 views
0

Prenons l'exemple de code suivant:Portée de l'objet retourné par l'appelé w.r.t. les variables locales de l'appelant?

SomeClass Callee() { 
    // Option 1: 
    return SomeClass(/* initializer here */); 

    // Option 2: 
    SomeClass tmp(/* initializer here */); 
    // Do something to tmp here 
    return tmp; 
} 

void Caller() { 
SomeClass a(/* initializer here */); 
SomeClass b = Callee(); 
SomeClass c(/* initializer here */); 
} 

AFAIK, b vivent plus longtemps que c dans l'exemple ci-dessus, mais pas plus que a.

Cependant, que se passe-t-il si la valeur de retour de Callee() n'est affectée à aucune variable dans Caller()? L'objet retourné se comportera-t-il comme b dans l'exemple ci-dessus? Ou sera-t-il détruit avant que c ne soit créé? Je suppose que c'est le dernier, je veux juste être sûr.

L'exemple de code est:

void Caller() { 
SomeClass a(/* initializer here */); 
Callee(); // what is the scope for the object returned by it? 
SomeClass c(/* initializer here */); 
} 
+0

Cette question n'est pas claire. Il mentionne 2 options pour la fonction, mais ne les référence jamais plus tard. De plus, je ne comprends pas la dernière phrase. Je suggère que la question soit reformulée. – SergeyA

+1

Les objets n'ont pas d'étendues. Ils ont des vies. Les noms ont des portées. –

Répondre

2

Oui, ce sera DESTRUCTED avant même c est créé, en raison d'être temporaire. C'est la durée de vie est l'expression complète impliquant l'appel de la fonction.

[class.temporary]/4:

Lorsqu'une mise en œuvre introduit un objet temporaire d'une classe qui a un constructeur non trivial ([class.ctor], [class.copy]), il doit veiller à ce qu'un Le constructeur est appelé pour l'objet temporaire. De même, le destructeur doit être appelé pour un temporaire avec un destructeur non trivial ([class.dtor]). Les objets temporaires sont détruits comme dernière étape de l'évaluation de l'expression complète indiquant que (lexical) contient le point où ils ont été créés. Cela est vrai même si cette évaluation aboutit à une exception. La valeur calculs et les effets secondaires de la destruction d'un objet temporaire sont associé uniquement à l'expression complète, pas avec aucune sous-expression spécifique .