Question

Section 12.2.5 en C ++ 03 dit « temporaire lié à un élément de référence dans un du constructeur cteur-initialiseur (12.6.2) persiste jusqu'à ce que la sortie du constructeur "
Donc, j'ai essayé programme suivant

#include<iostream>
using namespace std;

struct foo
{
  foo()
  {
    cout<<"foo c'tor"<<endl;
  }
  ~foo()
  {
    cout<<"foo d'tor"<<endl;
  }
};

struct bar
{
  const foo &ref;
  bar():ref(foo()) 
  {
    cout<<"bar c'tor"<<endl;
  }

};

int main()
{
  bar obj;
}    

La sortie que je reçois est:

foo c'tor
foo d'tor
bar c'tor

selon la norme, générée par foo () temporaire dans la liste init-c'tor de c'tor de la barre sera détruite après c'tor de barre si foo d'tor doit être imprimé après bar c'tor
mais il est inverse.
S'il vous plaît expliquer la raison.

Était-ce utile?

La solution

J'ai essayé avec MS VS 2010, et il me donne la sortie donne également d'avertissement lors de la compilation:

avertissement C4413: 'bar :: ref': membre de référence est initialisé à un temporaire qui ne persiste pas après le constructeur sorties

foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .

Il semble que MS VS 2010 met en œuvre la spécification correctement. Je suis d'accord qu'il est un bug pour g ++.

EDIT: ref doit être initialisé dans constructor`s initialize liste

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top