我有以下代碼:它是未定義的行爲傳遞參考未初始化的變量?
#include <iostream>
void f(int &x) {
x = 5;
}
int main() {
int x;
f(x);
std::cout << x << std::endl;
return 0;
}
這段代碼中調用C++未定義行爲? g ++在沒有任何警告的情況下編譯它,代碼輸出5
(如預期的那樣)。
我有以下代碼:它是未定義的行爲傳遞參考未初始化的變量?
#include <iostream>
void f(int &x) {
x = 5;
}
int main() {
int x;
f(x);
std::cout << x << std::endl;
return 0;
}
這段代碼中調用C++未定義行爲? g ++在沒有任何警告的情況下編譯它,代碼輸出5
(如預期的那樣)。
此代碼中沒有未定義的行爲。它將被定義爲使用一個未初始化的變量,但它已被定義爲傳遞引用並通過引用執行賦值。
不,這不會調用不確定的行爲和預期的打印值爲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()
完成後,參考將指向無效內存。
未定義的行爲發生在評估產生不確定的值時,有一些例外(參見C++ 14標準的§8.5/ 12)。
在這種情況下,x
的值不會被使用,直到x
被分配後,所以這段代碼很好。不會訪問x
的值以綁定對其的引用。 (然而,要注意:一個int
也可以結合到const double&
,在這種情況下,值將訪問,並且一個新的臨時double
對象將從該值來創建。)
的關鍵在於一個lvalue-對未初始化的值進行右值轉換會導致UB。 –
代碼中存在右值? –
沒有,這就是爲什麼沒有UB :-)(當然,這裏有* rvalues,例如'5','0',以及'x的右值到左值轉換的結果''在'cout'中)。但我只是試圖給出一個更精確的定義,你的意思是「使用」。 –