Pregunta

Sección 12.2.5 en C ++ 03 dice " Un temporal unido a un miembro de referencia en una del constructor ctor-inicializador (12.6.2) persiste hasta que se salga del constructor "
Así que he intentado siguiente programa

#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 bien, según la norma, temporal generado por foo () en c'tor init-lista de c'tor de barra serán destruidos después de c'tor de barra de modo foo d'tor debe imprimirse después bar c'tor
pero es al revés.
Por favor, explique la razón.

¿Fue útil?

Solución

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

advertencia C4413: 'bar :: ref': miembro de referencia se inicializa a un temporal que no persisten después del constructor salidas

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

Parece que la EM VS 2010 aperos Especificación correctamente. Estoy de acuerdo en que se trata de un error de g ++.

EDIT: ref debe ser inicializado en constructor`s lista initialize

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top