cette sortie J'ai construit cela comme un contre-exemple pour montrer que le plus important-cons est une exception plutôt qu'une règle. Il est normalement écrit comme p> Lorsqu'une référence Const se lie à une temporaire, la durée de vie de ce temporaire est étendue à la durée de vie de la référence p>
blockQuote> J'essayais d'illustrer cela, bien que mais la sortie semble prouver que l'exemple est em> sûr, la durée de vie du est-ce correct? Où dans la norme est-ce spécifié? P> p> f ~ code> mais j'attendais
~ f code>
foo () code> est temporaire, la référence à
_x code> renvoyé par l'opérateur de conversion n'est pas et que Le code ci-dessus est dangereux. p>
FOO () code> est prolongé par L'existence d'une référence constante à l'un de ses membres. P>
4 Réponses :
C'est parce que le temporaire survit pendant toute la durée de l'appel de la fonction. Quand vous faites foo (foo ()); code> voici ce qui se passe: p>
foo code> est contiré, puis li>
opérateur const int & code> est appelé le temporaire li>
foo () code> est appelé et cette sortie
f code> li>
foo () code> retourne temporaire
foo code> est détruit et cette sortie
~ code> li>
ol>
Pour élaborer: le code est sûr tant que FOO code> ne stocke pas la référence.
Il n'y a pas de magie ici. Tous les arguments de la fonction vivent dans la portée de l'appelant, y compris les temporaires. Le donc quelle que soit la fonction FOO () temporaire () code> est construit dans la portée de l'appelant et détruit à la fin de la ligne. P>
foo () code> se passe avant em> ses arguments dans
principal () code> sont détruits. P>
La règle générale, en ce qui concerne les temporaires, est que leur vie se termine lorsque l'expression complète des extrémités (de manière informelle, lorsque vous atteignez le ; code>). P>
Mais votre Essayez: p> FOO code> L'instance ici allait toujours vivre jusqu'au point-virgule terminant la déclaration dans laquelle elle a été créée. Transmettre une référence à un membre dans un appel de la fonction n'a pas changé cela.
Foo const &ref = Foo(); // or function returning temp
foo(ref);
Les références de retour sont plus souvent une mauvaise idée qu'un bon. C'est un bon exemple de tel.
@ R.martinhofernandes donc vous déclarez
opérateur [] code> comme ...?