Ich habe versucht, die C ++ 0x Initialisierungslisten-Implementierung meiner G ++ - Version, aber es gibt nur leere Zeilen aus.
%Vor%Ich habe keine Ahnung, was ich falsch gemacht habe. Kann mir bitte jemand helfen?
Es sieht so aus, als ob Sie im obigen Beispiel zwei Initialisierungslisten erstellen. Temporäres {"hello", "stackoverflow"}
und std::initializer_list<std::string> a
.
Auf gcc sind {}
Initialisierungslisten tatsächlich temporäre Arrays, deren Lebensdauer nach vollständiger Anweisung endet (außer sie sind direkt an std::initializer_list
wie in der kommentierten Zeile im Beispiel unten gebunden).
Die Lebensdauer des internen Arrays der ersten Liste endet direkt nachdem der a
-Konstruktor zurückgegeben wurde und somit das Array a
nun auf ungültigen Speicher zeigt (gcc kopiert nur den Zeiger). Sie können überprüfen, dass std::string
Destruktoren aufgerufen werden, bevor Sie die Schleife eingeben.
Und wenn Sie zu einer Schleife kommen, lesen Sie ungültigen Speicher.
Laut dem neuesten Standardentwurf (n3242), §18.9 / 1, können Initialisierungslisten nicht einmal so kopiert werden (sie stellen keinen Konstruktor mit Parametern bereit).
%Vor%Mit gcc 4.5.0 bekomme ich
%Vor%Tags und Links c++ c++11 iterator stdinitializerlist