Heim > Artikel > Backend-Entwicklung > ## **Verlängert das Binden eines konstanten Verweises an ein Unterobjekt eines temporären Objekts dessen Lebensdauer? Eine Geschichte von GCC und Clang**
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.
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.
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!