Heim  >  Artikel  >  Backend-Entwicklung  >  Wie hoch ist die Lebensdauer einer geschweiften Init-Liste, die von einer C-Funktion zurückgegeben wird?

Wie hoch ist die Lebensdauer einer geschweiften Init-Liste, die von einer C-Funktion zurückgegeben wird?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-29 18:29:22650Durchsuche

 What is the Lifetime of a Braced-Init-List Returned from a C   Function?

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

  • Die Rückgabe einer geschweiften Init-Liste impliziert keine Kopie. Konstruktion des zurückgegebenen Objekts. Es verwendet einfach copy-list-initialization, um den Rückgabewert zu initialisieren.
  • DR 1290 hat den Wortlaut in Bezug auf die Lebensdauer von initializer_list überarbeitet, und DR 1565 und 1599 werden ebenfalls in Betracht gezogen, was möglicherweise weitere Änderungen mit sich bringt.
  • Das Binden eines zusätzlichen Verweises an die initializer_list verlängert nicht die Lebensdauer des zugrunde liegenden Arrays, ähnlich wie ein Verweis auf ein temporäres Objekt die Lebensdauer des temporären Objekts nicht verlängert.

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!

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