La liaison temporaire référence const dans c'tor initialiseur liste
-
12-10-2019 - |
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.
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
.