Frage

Abschnitt 12.2.5 in C ++ 03 sagt: „ Ein vorübergehende zu einem Referenzelement gebunden in einem Konstruktor Ctor-Initialisierer (12.6.2) verharrt, bis der Konstruktor Ausgänge "
Also habe ich versucht, folgende Programm

#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;
}    

Der Ausgang ich erhalte, ist:

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

Jetzt nach Standard, vorübergehend erzeugt durch foo () in c'tor init-Liste der Bar des c'tor wird nach Bar des c'tor zerstört werden, so foo d'tor sollte nach bar c'tor
gedruckt werden aber es ist anders herum.
Bitte legen Sie den Grund.

War es hilfreich?

Lösung

Ich habe schon versucht, diese mit MS VS 2010, und es gibt mir die Ausgabe ergibt auch während der Kompilierung Warnung:

Warnung C4413: 'bar :: ref': Referenzelement in einem temporären initialisiert wird, die nicht nach nicht bestehen bleiben Konstruktor Ausfahrten

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

Es scheint, dass MS VS 2010 Geräte korrekt Spezifikation. Ich bin damit einverstanden, dass es ein Fehler für g ++.

EDIT: ref sollte in constructor`s initialisiert werden initialisieren Liste

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top