」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > ## **將常數引用綁定到臨時物件的子物件是否會延長其生命週期? GCC 和 Clang 的故事**

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

發佈於2024-11-09
瀏覽:891

##  **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 (version X): 將臨時P2d 實例的生命週期延長到x 引用的生命週期,之後調用析構函數printf in main.

解釋

根據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