Binding temporanea per riferimento const in c'tor initializer lista
-
12-10-2019 - |
Domanda
Sezione 12.2.5 in C ++ 03 dice: " Una temporanea destinata a un membro di riferimento in un
costruttori ctor-inizializzatore (12.6.2) persiste fino a quando le uscite del costruttore "
Così ho provato seguente programma
#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;
}
L'output che ottengo è:
foo c'tor
foo d'tor
bar c'tor
Ora, secondo la norma, temporanea generata da foo () in c'tor init-lista di c'tor del bar saranno distrutti dopo c'tor di barra in modo foo d'tor
deve essere stampata dopo bar c'tor
ma è contrario.
Si prega di spiegare il motivo.
Soluzione
Ho provato questo con MS VS 2010, e mi dà l'uscita anche dà avvertimento durante la compilazione:
avviso C4413: 'bar :: ref': membro di riferimento è inizializzato a una temporanea che non persistono dopo il costruttore uscite
foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .
Sembra che MS VS 2010 attrezzi di specifica correttamente. Sono d'accordo che si tratta di un bug per g ++.
EDIT: ref deve essere inizializzato in constructor`s lista inizializzare
.