Warum verwendet diese initializer_list Fehlverhalten beim Übergeben von Zeichenfolgen?

9

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?

    
Johannes Schaub - litb 09.04.2011, 13:41
quelle

2 Antworten

3

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%     
Vitus 09.04.2011 19:37
quelle
1
%Vor%

Wenn ich das als:

deklariere %Vor%

Dann funktioniert es: Ссылка

Aber das ist seltsam. Sieht aus wie ein Compiler Bug.

BEARBEITEN:

Es ist sicherlich ein Compiler Bug, denn wenn ich (*it).c_str() schreibe, druckt er die Strings !!

%Vor%

Code: Ссылка

    
Nawaz 09.04.2011 13:44
quelle