將常數引用綁定到子物件時的行為暫存值由C 標準定義,並根據編譯器供應商的不同而有所不同。
根據 CWG 1651,應用於純右值的成員存取或下標表達式的結果應視為一個 x 值。這意味著綁定對臨時物件的此類子物件的參考不應延長臨時物件的生命週期。
但是,在提供的範例中,兩個編譯器都將 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 中的當前行為預計都會改變。
以上是## **將常數引用綁定到臨時物件的子物件是否會延長其生命週期? GCC 和 Clang 的故事**的詳細內容。更多資訊請關注PHP中文網其他相關文章!