La sezione 12.2.5 in C++ 03 dice "Un vincolo temporaneo a un membro di riferimento in uniniziatore del costruttore (12.6.2) del costruttore fino all'uscita dal costruttore "
Così ho provato seguente programmaAssociazione temporanea al riferimento const nella lista di inizializzatore c'tor
#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 ini t-list del bar c'tor sarà distrutto dopo il bar così che foo d'tor
dovrebbe essere stampato dopo bar c'tor
ma è il contrario.
Si prega di spiegare il motivo.
Cosa succede se si fa riferimento a "ref" all'interno del costruttore? Forse il compilatore decide che dal momento che non è effettivamente utilizzato può distruggerlo prima. –
VS2008 produce output 'foo, bar, foo' dove gcc 4.3.4 produce output' foo, foo, bar'. Interessante ... – Naveen
g ++ bug, report. –