Heim  >  Artikel  >  Backend-Entwicklung  >  Warum unterscheidet sich die Lebensdauer eines „std::initializer_list'-Rückgabewerts zwischen GCC und Clang?

Warum unterscheidet sich die Lebensdauer eines „std::initializer_list'-Rückgabewerts zwischen GCC und Clang?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 10:06:021051Durchsuche

Why Does the Lifetime of an `std::initializer_list` Return Value Differ Between GCC and Clang?

Lebensdauer eines std::initializer_list-Rückgabewerts: GCC vs. Clang-Verhalten

Im bereitgestellten Code geben Sie einen std zurück ::initializer_list aus einer Funktion und beobachtet unerwartetes Destruktorverhalten. Konkret wird das von der Funktion zurückgegebene Array zerstört, bevor Sie auf seine Elemente zugreifen können.

Das zugrunde liegende Problem ergibt sich aus der Tatsache, dass ein std::initializer_list gemäß dem C-Standard ein Array von Elementen hat Wird mit der gleichen Lebensdauer wie die initializer_list erstellt. Das bedeutet, dass das Array standardmäßig am Ende der Return-Anweisung in Ihrer Funktion zerstört wird.

Die GCC-Implementierung befolgt dieses Verhalten, während Clang dies nicht tut. Clang behält die Lebensdauer des Arrays über das Ende der Return-Anweisung hinaus bei, was nicht dem Standard entspricht. Das Verhalten von Clang scheint jedoch inkonsistent zu sein, da die Objektdestruktoren nie aufgerufen werden.

Copy-List-Initialisierung und Compiler-Interpretationen

Die Return-Anweisung mit einem geschweiften-init- list initialisiert den Rückgabewert über copy-list-initialization, was bedeutet, dass ein vorhandenes Objekt kopiert wird. In diesem Fall wird ein temporäres initializer_list-Objekt aus der in Klammern eingeschlossenen Liste kopiert. Anschließend wird ein weiteres initializer_list-Objekt vom ersten kopiert.

Der Standard besagt, dass die Lebensdauer des Arrays mit der des initializer_list-Objekts übereinstimmt, aber da mehrere Kopien der initializer_list erstellt werden, ist unklar, welches Objekt die Lebensdauer bestimmt die Lebensdauer des Arrays.

GCC interpretiert den Standard unter Berücksichtigung der Lebensdauer des zurückgegebenen initializer_list-Objekts, was zur vorzeitigen Zerstörung des Arrays führt. Das in 8.5.4/6 bereitgestellte Beispiel legt jedoch nahe, dass sich die Lebensdauer des Arrays bis zum Ende des umschließenden Ausdrucks einschließlich der Empfangsfunktion erstrecken sollte.

Zusammenfassung des Compilerverhaltens und der Standardmehrdeutigkeit

  • GCC: Folgt dem Standard und zerstört das Array am Ende der Return-Anweisung.
  • Clang: Verlängert die Lebensdauer des Arrays über die Return-Anweisung hinaus, zerstört jedoch Objektdestruktoren nicht ordnungsgemäß.
  • Der Standard ist nicht eindeutig, welches initializer_list-Objekt die Lebensdauer des Arrays bestimmt.

Empfehlung

Um unerwartetes Verhalten zu vermeiden, wird dies im Allgemeinen nicht empfohlen um eine std::initializer_list nach Wert zurückzugeben. Wenn Sie eine variable Anzahl von Objekten übergeben müssen, sollten Sie stattdessen die Verwendung einer Containerklasse wie std::vector in Betracht ziehen.

Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die Lebensdauer eines „std::initializer_list'-Rückgabewerts zwischen GCC und Clang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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