2016-02-10 37 views

回答

10

此代碼中沒有未定義的行爲。它將被定義爲使用一個未初始化的變量,但它已被定義爲傳遞引用並通過引用執行賦值。

+0

的關鍵在於一個lvalue-對未初始化的值進行右值轉換會導致UB。 –

+0

代碼中存在右值? –

+0

沒有,這就是爲什麼沒有UB :-)(當然,這裏有* rvalues,例如'5','0',以及'x的右值到左值轉換的結果''在'cout'中)。但我只是試圖給出一個更精確的定義,你的意思是「使用」。 –

2

不,這不會調用不確定的行爲和預期的打印值爲5 既然你宣佈你的功能void f(int& x)int&是引用類型,並改變它綁定到變量的值,並不會複製。

知道什麼是不確定的行爲與引用一個真實的例子:

int& f() { 
    int x = 5; 
    return x; //return a reference of a variable that will not exist 
    //after f finished 
} 

int main() { 
    std::cout << f() << std::endl; //undefined behavior 
} 

這是不確定的行爲,因爲引用不採取保持分配的數據有效,他們參考,參考只是改變的責任,如果它們有效,則讀取值。因此在f()完成後,參考將指向無效內存。

5

未定義的行爲發生在評估產生不確定的值時,有一些例外(參見C++ 14標準的§8.5/ 12)。

在這種情況下,x的值不會被使用,直到x被分配後,所以這段代碼很好。不會訪問x的值以綁定對其的引用。 (然而,要注意:一個int也可以結合到const double&,在這種情況下,值訪問,並且一個新的臨時double對象將從該值來創建。)