2011-01-18 8 views
12

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.

+1

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. –

+2

VS2008 produce output 'foo, bar, foo' dove gcc 4.3.4 produce output' foo, foo, bar'. Interessante ... – Naveen

+12

g ++ bug, report. –

risposta

3

Ho provato questo con MS VS 2010, e mi dà l'uscita dà anche avvertimento durante la compilazione:

C4413 avvertimento: 'bar :: ref': membro di riferimento è inizializzato a una temporanea che doesn' t persistono dopo il costruttore esce

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

sembra che MS VS 2010 implementa in modo corretto specifica. Sono d'accordo che si tratta di un bug per g ++.

MODIFICA: il riferimento deve essere inizializzato nella lista di inizializzazione del costruttore.