Heim >Backend-Entwicklung >C++ >Ist die Zerstörung eines zurückgegebenen „std::initializer_list'-Arrays durch GCC korrekt?

Ist die Zerstörung eines zurückgegebenen „std::initializer_list'-Arrays durch GCC korrekt?

Linda Hamilton
Linda HamiltonOriginal
2024-11-01 17:08:02436Durchsuche

Is GCC's Destruction of a Returned `std::initializer_list` Array Correct?

Lebensdauer des zurückgegebenen std::initializer_list-Arrays

Die Lebensdauer eines von einer Funktion zurückgegebenen std::initializer_list-Arrays hat eine Diskussion darüber ausgelöst Verhalten in verschiedenen Compilern. Es stellt sich die Frage, ob die Zerstörung des Arrays durch GCC am Ende des zurückgegebenen vollständigen Ausdrucks korrekt ist.

Analyse des Standards

Gemäß C 11 §6.6. 3/2 führt eine Return-Anweisung mit einer geschweiften Init-Liste dazu, dass das zurückgegebene Objekt oder die zurückgegebene Referenz aus der Initialisierungsliste mit der Kopierliste initialisiert wird. Dieser Prozess initialisiert ein temporäres Objekt „initializer_list“ und den zugrunde liegenden Array-Speicher aus der Initialisierungsliste, und dann wird eine weitere „initializer_list“ von der ersten initialisiert.

Die Lebensdauer des Arrays, wie in 8.5.4/6 definiert, entspricht der Lebensdauer des initializer_list-Objekts. Dies kann anhand eines Beispiels verstanden werden, bei dem das Objekt und das Array initializer_list eine vollständige Ausdruckslebensdauer für einen std::vector haben, der mit einer Klammer-Init-Liste initialisiert wurde.

Rückgabewert einer Klammer-Init -List

Wenn eine bloße, in geschweifte Klammern eingeschlossene Liste zurückgegeben wird, wird die Copy-List-Initialisierung verwendet. Dies ähnelt der Syntax nocopy und Clang

Es gibt jedoch eine Diskrepanz in der Implementierung zwischen GCC und Clang. GCC zerstört das Array vor der Rückgabe, während Clang eine benannte initializer_list beibehält, aber niemals die Objekte in der Liste zerstört.

Empfehlung

Es wird empfohlen, die Verwendung von std: zu vermeiden: initializer_list, um Werte mit der Erwartung weiterzugeben, dass sie bestehen bleiben. Unsicherheiten in den Standard- und Compiler-Implementierungen machen es unzuverlässig, die Objektlebensdauer aufrechtzuerhalten.

Das obige ist der detaillierte Inhalt vonIst die Zerstörung eines zurückgegebenen „std::initializer_list'-Arrays durch GCC korrekt?. 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