7
votes

Pas le const le plus important .. mais qu'est-ce que c'est?

cette sortie f ~ mais j'attendais ~ f xxx

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

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

J'essayais d'illustrer cela, bien que foo () est temporaire, la référence à _x renvoyé par l'opérateur de conversion n'est pas et que Le code ci-dessus est dangereux.

mais la sortie semble prouver que l'exemple est sûr, la durée de vie du FOO () est prolongé par L'existence d'une référence constante à l'un de ses membres.

est-ce correct? Où dans la norme est-ce spécifié?


2 commentaires

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 [] comme ...?


4 Réponses :


1
votes

C'est parce que le temporaire survit pendant toute la durée de l'appel de la fonction. Quand vous faites foo (foo ()); voici ce qui se passe:

  1. temporaire foo est contiré, puis
  2. opérateur const int & est appelé le temporaire
  3. foo () est appelé et cette sortie f
  4. Une fois foo () retourne temporaire foo est détruit et cette sortie ~

1 commentaires

Pour élaborer: le code est sûr tant que FOO ne stocke pas la référence.



1
votes

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 FOO () temporaire () est construit dans la portée de l'appelant et détruit à la fin de la ligne.

donc quelle que soit la fonction foo () se passe avant ses arguments dans principal () sont détruits.


0 commentaires

6
votes

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 ; ).

12.2 Objets temporaires

3 / [...] Les objets temporaires sont détruits comme la dernière étape consistant à évaluer l'expression complète (1.9) qui (lexiquement) contient le point où ils ont été créés. Ceci est vrai même si cette évaluation se termine par lancer une exception. Les calculs de valeur et les effets secondaires de la destruction d'un objet temporaire ne sont associés qu'avec l'expression complète, pas avec une subexpression spécifique.


0 commentaires

0
votes

Mais votre 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.

Essayez: p>

Foo const &ref = Foo(); // or function returning temp
foo(ref);


0 commentaires