2011-01-18 16 views
12

Sección 12.2.5 en C++ 03 dice "Un límite temporal a un miembro de referencia en un inicializador de cc del constructor (12.6.2) persiste hasta que el constructor sale "
así que traté siguiente programaEnlace temporal a referencia const en lista de inicializador 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; 
}  

La salida que recibo es:

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

Ahora según la norma, temporales generados por foo() en ini c'tor La lista t del códec de barra se destruirá después del c'tor de barra para que foo d'tor se imprima después de bar c'tor
pero es al revés.
Por favor, explica el motivo.

+1

¿Qué sucede si hace referencia a 'ref' dentro del constructor? Quizás el compilador decida que, dado que no se usa en realidad, puede destruirlo antes. –

+2

VS2008 produce la salida 'foo, bar, foo' donde gcc 4.3.4 produce la salida' foo, foo, bar'. Interesante ... – Naveen

+12

g ++ error, informe. –

Respuesta

3

He intentado esto con MS VS 2010, y me da la salida también da advertencia durante la compilación:

C4413 advertencia: 'barra :: ref': miembro de referencia se inicializa a un temporal que doesn' t persisten después del constructor sale

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

parece que MS VS 2010 implementa la especificación correcta. Estoy de acuerdo en que es un error para g ++.

EDITAR: ref se debe inicializar en la lista de inicialización del constructor.

Cuestiones relacionadas