首頁 >後端開發 >C++ >## **將常數引用綁定到臨時物件的子物件是否會延長其生命週期? GCC 和 Clang 的故事**

## **將常數引用綁定到臨時物件的子物件是否會延長其生命週期? GCC 和 Clang 的故事**

Barbara Streisand
Barbara Streisand原創
2024-11-01 06:58:02567瀏覽

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

將常數引用綁定到臨時物件的子物件

標準行為

將常數引用綁定到子物件時的行為暫存值由C 標準定義,並根據編譯器供應商的不同而有所不同。

GCC 和Clang 差異

  • GCC(版本5.2.0):在main 中輸入printf 之前銷毀臨時P2d 實例,透過建立另一個雙雙位元表精度值來保留該值。
  • Clang(版本 X): 將臨時 P2d 實例的生命週期延長到x 引用,在 main 中的 printf 之後呼叫析構函數。

說明

根據 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn