2012-04-17 113 views
9

我有此代碼(簡化版本):綁定到函數參數的引用是否會延長該臨時的生命週期?

const int& function(const int& param) 
{ 
    return param; 
} 

const int& reference = function(10); 
//use reference 

我不能完全決定哪個程度C++ 03標準$ 12.2/5措詞

臨時到該參考是結合或臨時的對臨時綁定的子對象的完整對象的臨時對象在參考的生命週期中保留...

適用於此處。

reference變量在上面的代碼中有效還是懸擺?調用代碼中的引用是否會延長作爲參數傳遞的臨時生命週期?

回答

9

A full-expression是不是另一個表達式的子表達式的表達式。在這種情況下,含有該呼叫function(10)全表達是賦值表達式:

const int& reference = function(10); 

爲了調用function使用參數10,臨時常量引用對象被創建爲臨時整數對象10。臨時整數和臨時const參考的生命週期通過賦值擴展,因此雖然賦值表達式有效,但嘗試使用reference引用的整數是未定義行爲,因爲reference不再引用活動對象。

的C++ 11標準,我想,澄清的情況:

到其中參考結合臨時或暫時這是一個子對象的完整的對象,其參考結合仍然存在用於參考的除了壽命:

...

- 甲暫時結合到在一個函數調用(5.2.2)的參考參數持續直到包含該呼叫的全表達的完成。

編輯:「臨時到的引用綁定...持續基準的壽命」。在這種情況下,引用的生命週期結束於賦值表達式的末尾,臨時整數的生命週期也一樣。

2

這將編譯,但你最終會有一個懸而未決的參考。在function返回後,param被釋放。

  1. 函數調用來臨時,匿名對象
  2. 函數返回
  3. 現在函數返回臨時參數是釋放
  4. 參考現在晃來晃去的目的是參考參考銷燬

如果您已將其設置爲非常量,那麼它將不會編譯,因爲您無法將非常量引用傳遞給匿名對象。

+0

在作業結束時是不是'param'被銷燬? 「臨時對象被作爲評估完整表達式(1.9)的最後一步被破壞掉(詞法上)包含它們被創建的點。」 – 2012-04-17 15:19:00

1

正是這部分是重要

臨時其中引用綁定到

在這種情況下,參數被綁定到臨時的,並且該呼叫之後將被破壞。

您無法通過傳遞參考來延長壽命。

+1

你不能否認他的'參考'是綁定到臨時的。事實上,有幾個參考文獻綁定到臨時文件。這裏的標準措辭非常糟糕。當然,這個意圖是隻延長到與實際臨時初始化的參考相匹配。遺憾的是,這不是標準所說的。 – 2012-04-17 12:31:34

+2

@JamesKanze:我同意這個措詞不是很精確,但是說到一個單獨的編譯模型,編譯器不可能知道臨時的生命週期應該在函數之後的調用位置被擴展完成。編譯器不可能知道返回的引用是否與參數或任何其他對象綁定到相同的對象(即'const int&function(const int&){static int i = 0; return i;}') – 2012-04-17 13:23:42

+0

這個答案並不是' t可以解決任何問題......暫時在聲明結尾處以分號銷燬,而不是在緊接呼叫之後。 – Potatoswatter 2012-04-17 14:56:18

2

從C++ 11 viepoint由函數返回一個參考是臨時:

12.12.1類類型的臨時對象被在各種情況下產生:參考結合到prvalue( 8.5.3),返回一個prvalue(6.6.3),一個創建一個prvalue(4.1,5.2.9,5.2.11,5.4)的轉換,拋出一個異常(15.1), 進入一個處理程序(15.3),和一些初始化(8.5)。

函數返回一個參考dosn't返回prvalue(「純rvalue」),所以它不是一個臨時的。 這似乎是很自然的:編譯器不能管理引用對象的生命週期,這是程序員的責任

因此,編譯器爲const int的&參考不提供任何liftime guarantes,因爲它是無界暫時的。

+0

......這是C++ 11修正了C++ 03的模棱兩可的措辭的一個地方,這是一個應該採取追溯措施的修復措施。 – Potatoswatter 2012-04-17 14:58:47

相關問題