Heim > Artikel > Backend-Entwicklung > Warum unterscheidet sich die Lebensdauer eines „std::initializer_list'-Rückgabewerts zwischen GCC und 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
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!