2016-10-17 2 views
0

Je suis confus si l'extrait suivant foo est garanti, c'est-à-dire si je suis autorisé à stocker des valeurs de retour de fonction comme références constantes?Référence renvoyant la valeur de la fonction

Je demande parce que la valeur de retour est stockée sur une pile-cadre, qui pourrait être invalide peu de temps après que la valeur a été retournée.

Foo getFoo() { 
    return Foo(); 
} 

void bar() { 
    const auto& foo = getFoo(); 

    // more function calls... 

    // is foo guaranteed to be valid? 
} 
+1

Oui, c'est valide. –

+0

Je voulais souligner un aspect différent de la question. Celui qui est marqué comme doublon et le lien de Herb Sutter n'aborde pas vraiment la perspective de la mémoire. Je suis vraiment curieux de savoir pourquoi l'objet référencé n'est pas écrasé lorsque de nouvelles stackframes sont allouées. – user695652

+0

Je suppose que c'est une fonctionnalité définie par l'implémentation. –

Répondre

1

Il est valide C++, mais il faut savoir que certains compilateurs (par exemple Visual Studio 2015, pour autant que je sache) ne mettent pas en œuvre correctement.

Selon la norme (N4140):

12.2 objets temporaires
....

Il y a deux contextes dans lesquels sont détruits à temporaires un point différent de celui fin de la fullexpression. Le premier contexte est lorsqu'un constructeur par défaut est appelé pour initialiser un élément d'un tableau. Si le constructeur a un ou plusieurs arguments par défaut, la destruction de chaque élément temporaire créé dans un argument par défaut est séquencée avant la construction de l'élément de tableau suivant, le cas échéant.

Le deuxième contexte est lorsqu'une référence est liée à un temporaire. Le temporaire dans lequel la référence est lié ou temporaire qui est l'objet complet d'un sous-objet pour lequel la référence est lié persiste pendant toute la durée de la référence sauf:

(quelques exceptions)