Lebensdauer eines Rückgabewerts einer geschweiften Init-Liste
In C wirft die Rückgabe einer geschweiften Init-Liste von einer Funktion Fragen zu auf die Lebensdauer der initializer_list und des zugrunde liegenden Arrays.
Problemübersicht
Vorherige Analysen legen nahe, dass GCC das Array initializer_list fälschlicherweise vor dem Ende des Rückgabeausdrucks beendet, während Clang Behält Objekte falsch bei, ohne sie jemals zu zerstören.
Standardinterpretation
Gemäß dem C 11-Standard initialisiert eine Return-Anweisung mit einer geschweiften Init-Liste den Rückgabewert durch Kopierlisteninitialisierung. Wenn der Rückgabetyp eine Spezialisierung von std::initializer_list ist, wird ein initializer_list-Objekt aus der angegebenen Liste erstellt und initialisiert.
Array-Lebensdauer
Die erstellte initializer_list speichert a Verweis auf ein Array von Elementen, die aus der Initialisierungsliste initialisiert wurden. Die Lebensdauer des Arrays ist so definiert, dass sie mit der des initializer_list-Objekts übereinstimmt. Dies bedeutet, dass in der Return-Anweisung das zugrunde liegende Array aus der Klammer-Init-Liste initialisiert wird und eine Lebensdauer hat, die bis in den aufrufenden Bereich reicht.
Korrekte Implementierung
Daher besteht das erwartete Verhalten darin, dass das Array von initializer_list in der aufrufenden Funktion bestehen bleiben sollte, um seine weitere Verwendung oder Bindung an eine benannte Referenz zu ermöglichen. Die aktuelle Implementierung von GCC gibt das Array jedoch vorzeitig frei und verstößt damit gegen diese Erwartung.
Zusätzliche Klarstellungen
Das obige ist der detaillierte Inhalt vonWie hoch ist die Lebensdauer einer geschweiften Init-Liste, die von einer C-Funktion zurückgegeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!