Heim > Backend-Entwicklung > C++ > Zerstört GCC von Funktionen zurückgegebene „std::initializer_list'-Arrays vor dem Ende des vollständigen Rückgabeausdrucks?

Zerstört GCC von Funktionen zurückgegebene „std::initializer_list'-Arrays vor dem Ende des vollständigen Rückgabeausdrucks?

Linda Hamilton
Freigeben: 2024-10-29 09:35:30
Original
489 Leute haben es durchsucht

 Does GCC Destroy `std::initializer_list` Arrays Returned from Functions Before the End of the Return Full-Expression?

Lebensdauer eines std::initializer_list-Rückgabewerts

Übersicht

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?

Analyse

Antwort: Nein, das ist nicht korrekt.

Detaillierte Erläuterung

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.

Schlussfolgerung

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage