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.

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top