將常量引用綁定到子對象時的行為臨時值由C 標準定義,並根據編譯器供應商的不同而變化。
根據CWG 1651,應用於純右值的成員存取或下標表達式的結果應視為xvalue。這意味著綁定對臨時物件的此類子物件的參考不應延長臨時物件的生命週期。
但是,在提供的範例中,兩個編譯器都將 center().x 視為純右值。使用標量子物件時,GCC 不會延長生命週期,因為[dcl.init.ref]/(5.2.1.1) 未涵蓋它們。因此,臨時物件可以提前銷毀。
相較之下,Clang 已實作了 DR 1651 的未決解,其中規定,如果 E1 是臨時表達式且 E2 沒有指定位元字段,則 E1 .E2 是臨時表達式。由於根據此定義,center() 是一個臨時表達式,因此 [class.temporary] /5 中的修改措詞適用。它明確指出相應的臨時物件在引用的生命週期內持續存在。
因此,在這種情況下,Clang 延長了臨時 P2d 實例的生命週期,而 GCC 則沒有。
一旦對 C 標準的擬議修訂被採納,GCC 和 Clang 中的當前行為預計將發生變化。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3