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 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.
Das aktuelle Verhalten sowohl in GCC als auch in Clang wird sich voraussichtlich ändern, sobald die vorgeschlagenen Überarbeitungen des C-Standards angenommen werden.
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