Heim > Artikel > Backend-Entwicklung > Ist die Zerstörung eines zurückgegebenen „std::initializer_list“-Arrays durch GCC korrekt?
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!