0

我需要一些關於const引用的說明。 從this link
使用const引用延長臨時對象的生命

const Foo &myFoo = FuncBar(); 

const引用擴展本地對象的壽命。但是,當我檢查this link雖然他們使用const引用

Sandbox(const string& n) : member(n) {} 

串的一生「四個一」並沒有增加。

Sandbox sandbox(string("four")); 

他們用了一句

只有本地常量引用延長使用壽命。

然後在第二個環節是不是字符串「四個一」本地的主要功能,不能使用const參考n延長其壽命?
那麼,爲什麼生命不會在第二個環節中延長呢?

+4

「本地」,如 「*局部變量*」。 –

+3

你的問題現在不是真正獨立,因爲「四」等的定義被隱藏在鏈接後面。你可以編輯相關部分嗎? – Angew

+0

我的意思是在第一個鏈接中不是主函數本地的字符串「four」,所以變量n是對「four」的本地const引用? – user3762146

回答

2

您引用的兩個鏈接在某種意義上是不同的,即表示使用本地const引用,而其他表示使用類成員const引用。

當我們創建本地const引用並引用一個臨時對象時,在這個編譯器中擴展了臨時對象的生命期,直到本地const引用的作用域。

指向臨時對象的類成員const引用將導致意外的結果,因爲臨時對象的生命期不會超出構造函數調用以初始化類成員引用。正如其中一個答案所解釋的那樣,臨時只會存在直到構造函數完成。

從引用答案: Does a const reference prolong the life of a temporary?

的壽命延長是不是通過函數參數傳遞。 §12.2/ 5 [class.temporary]:

第二個上下文是引用綁定到臨時的時候。引用所綁定到的臨時對象或臨時綁定的子對象的完整對象的臨時對象在引用的生命週期內保留,除非如下所述。在構造函數的ctor-initializer(§12.6.2[class.base.init])中臨時綁定到引用成員,直到構造函數退出。臨時綁定到函數調用中的引用參數(第5.2.2節[expr.call])將一直存在,直到完成包含調用的完整表達式。

如果你正確地分析它,你將會意識到,在這兩種情況下,臨時的壽命都會延長到引用初始化的範圍有效。一旦參考範圍超出範圍,臨時變爲無效。

對於本地const引用,作用域在函數內部,從它被初始化爲temp。 對於類成員const引用,作用域是構造函數,它正在初始化爲temp。

你也應該閱讀這GOTW文章: https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

相關問題