Heim >Backend-Entwicklung >C++ >## **Verlängert das Binden eines konstanten Verweises an ein Unterobjekt eines temporären Objekts dessen Lebensdauer? Eine Geschichte von GCC und Clang**

## **Verlängert das Binden eines konstanten Verweises an ein Unterobjekt eines temporären Objekts dessen Lebensdauer? Eine Geschichte von GCC und Clang**

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 06:58:02570Durchsuche

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

Binden einer konstanten Referenz an ein Unterobjekt eines Temporären

Standardverhalten

Das Verhalten beim Binden einer konstanten Referenz an ein Unterobjekt eines Temporärs wird durch den C-Standard definiert und variiert je nach Compiler-Anbieter.

GCC- und Clang-Unterschiede

  • GCC (Version 5.2.0): Zerstört die temporäre P2d-Instanz vor der Eingabe von printf in main und behält den Wert bei, indem ein weiteres temporäres Double erstellt wird.
  • Clang (Version X): Verlängert die Lebensdauer der temporären P2d-Instanz auf die Lebensdauer von die x-Referenz, die den Destruktor nach printf in main aufruft.

Erläuterungen

Gemäß CWG 1651 sollte das Ergebnis eines Mitgliedszugriffs oder eines Indexausdrucks, der auf einen Wert angewendet wird, behandelt werden als ein x-Wert. Dies impliziert, dass das Binden eines Verweises an ein solches Unterobjekt eines temporären Objekts die Lebensdauer des temporären Objekts nicht verlängern sollte.

Im bereitgestellten Beispiel behandeln jedoch beide Compiler center().x als PR-Wert. GCC verlängert die Lebensdauer nicht, wenn skalare Unterobjekte verwendet werden, da diese nicht von [dcl.init.ref]/(5.2.1.1) abgedeckt werden. Daher kann das temporäre Objekt frühzeitig zerstört werden.

Im Gegensatz dazu hat Clang die ausstehende Lösung zu DR 1651 umgesetzt, die besagt, dass E1, wenn E1 ein temporärer Ausdruck ist und E2 kein Bitfeld bezeichnet, E1 .E2 ist ein temporärer Ausdruck. Da es sich bei center() gemäß dieser Definition um einen temporären Ausdruck handelt, gilt der geänderte Wortlaut in [class.temporary] /5. Es besagt ausdrücklich, dass das entsprechende temporäre Objekt für die Lebensdauer der Referenz bestehen bleibt.

Daher verlängert Clang in diesem Fall die Lebensdauer der temporären P2d-Instanz, während GCC dies nicht tut.

Schlussfolgerung

Das aktuelle Verhalten sowohl in GCC als auch in Clang wird sich voraussichtlich ändern, sobald die vorgeschlagenen Überarbeitungen des C-Standards angenommen werden.

Das obige ist der detaillierte Inhalt von## **Verlängert das Binden eines konstanten Verweises an ein Unterobjekt eines temporären Objekts dessen Lebensdauer? Eine Geschichte von GCC und Clang**. 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