„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > ## **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**

Veröffentlicht am 09.11.2024
Durchsuche:566

##  **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 Objekts

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 der x-Referenz und ruft den Destruktor auf nach printf in main.

Erläuterungen

Gemäß CWG 1651 sollte das Ergebnis eines Mitgliedszugriffs oder eines Indexausdrucks, der auf einen PR-Wert angewendet wird, als X-Wert behandelt werden. 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 für DR 1651 implementiert, die besagt, dass E1 gilt, wenn E1 ein temporärer Ausdruck ist und E2 kein Bitfeld bezeichnet .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.

Fazit

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

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3