Frage: Ist es richtig, dass die GCC-Implementierung einen zerstört? std::initializer_list-Array, das von einer Funktion am Ende des vollständigen Rückgabeausdrucks zurückgegeben wurde?
Antwort: Nein, das ist nicht korrekt.
Gemäß dem C 11-Standard initialisiert eine Return-Anweisung mit einer geschweiften Init-Liste das Objekt oder die Referenz, die durch Copy-List-Initialisierung aus der angegebenen Initialisierungsliste zurückgegeben werden soll. Wenn eine Initialisierungsliste zum Erstellen eines initializer_list-Objekts verwendet wird, wird ein Array zum Speichern der Elemente der Liste zugewiesen. Die Lebensdauer des Arrays ist wie folgt definiert:
Die Lebensdauer des Arrays ist dieselbe wie die des initializer_list-Objekts.
Im bereitgestellten Beispiel wird das initializer_list-Objekt als Rückgabe erstellt Wert aus der Funktion send(). Es wird mit drei noisydt-Objekten initialisiert und dann an die Funktion „receive()“ zurückgegeben. Die Lebensdauer des mit dem initializer_list-Objekt verknüpften Arrays sollte sich bis in die Funktion „receive()“ erstrecken, sodass auf die Elemente der Liste zugegriffen und diese verwendet werden können.
Die GCC-Implementierung zerstört jedoch fälschlicherweise das Array vor dem Rückgabewert verwendet werden, was zu undefiniertem Verhalten führt. Das richtige Verhalten besteht darin, dass das Array bis zum Ende der Funktion „receive()“ bestehen bleibt. Sowohl Clang als auch ICC zeigen das korrekte Verhalten.
Der Umgang der GCC-Implementierung mit std::initializer_list-Rückgabewerten entspricht nicht dem C 11-Standard. Clang und ICC stellen korrekte Implementierungen bereit und es wird empfohlen, diese Compiler zu verwenden, wenn Sie mit std::initializer_lists arbeiten.
Das obige ist der detaillierte Inhalt vonZerstört GCC von Funktionen zurückgegebene „std::initializer_list'-Arrays vor dem Ende des vollständigen Rückgabeausdrucks?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!