2013-06-28 50 views
6

標準的12.2.5節說:臨時壽命延長

臨時結合到在函數調用的基準參數(5.2.2) 持續直到含有 呼叫充分表達的完成。函數返回 語句(6.6.3)中的返回值的臨時綁定一直存在,直到函數退出。在所有這些情況下,在表達式 的評估過程中創建的臨時對象在 的全表達式結尾處被銷燬,除了臨時參考被綁定到該臨時對象外,它們被創建並且在完成相反順序的 他們的建設。

我試圖理解的代碼是:

#include <iostream> 

const int& foo(const int& fooRef) 
{ 
    return fooRef; 
}          // #0 

int main (void) 
{ 
    const int& numberRef = foo(5);  // #1 
    std::cout << numberRef;   // #2 
    return 0; 
} 

在線#1創建和綁定到foofooRef參數臨時對象。 fooRef在線#0被銷燬。所以我認爲臨時應該在這裏銷燬,因爲終身延長不是傳遞性的。

問題:

  1. 是什麼until the function exits意思?這是否意味着untill it finished executing

  2. 爲什麼我會得到一個5輸出。第#2行上是否還存在臨時對象?

  3. 如何解釋標準報價以找出這個例子的工作原理?

參考標準的分步原子走查將不勝感激。謝謝!

P. S.一個被接受的答案here也告訴代碼是broken,我沒有得到,爲什麼我得到這樣的程序輸出。

回答

3

直到函數退出意味着什麼?這是否意味着它完成執行?

是的。

爲什麼我會得到5個輸出。第2行是否還存在臨時對象?

取消引用未綁定到居住對象的引用是不確定的行爲,所以你可能會得到5以及42以及其他任何東西(包括崩潰)。對於未定義行爲的程序,您根本無法預料。

我該如何解釋標準報價來找出這個例子的工作原理?

很像你做already.The暫時被綁定到函數參數fooRef,在函數返回時被銷燬。由於該臨時值綁定到返回值,因此該函數返回時,該對象將不再存在。稍後,您將取消引用一個懸空引用,這會爲您提供UB。

1
  1. 它意味着直到結束大括號,即}

  2. 你調用了UB,你有一個懸而未決的參考。

請嘗試以下修改代碼並查看它打印的內容。它可能會打印6,因爲這是堆棧中的最後一個。或者嘗試傳遞std::string,您可能會崩潰。

int main (void) 
{ 
    const int& numberRef = foo(5); 
    foo(6); 
    std::cout << numberRef; 
    return 0; 
}