C++ 通过引用传递未初始化的变量是未定义的行为吗?
我有以下代码:C++ 通过引用传递未初始化的变量是未定义的行为吗?,c++,pass-by-reference,undefined-behavior,C++,Pass By Reference,Undefined Behavior,我有以下代码: #include <iostream> void f(int &x) { x = 5; } int main() { int x; f(x); std::cout << x << std::endl; return 0; } #包括 空f(int&x){ x=5; } int main(){ int x; f(x); std::cout此代码中没有未定义的行为。在赋值之前使用未初始化的变量将
#include <iostream>
void f(int &x) {
x = 5;
}
int main() {
int x;
f(x);
std::cout << x << std::endl;
return 0;
}
#包括
空f(int&x){
x=5;
}
int main(){
int x;
f(x);
std::cout此代码中没有未定义的行为。在赋值之前使用未初始化的变量将是未定义的,但传递引用并通过引用执行赋值是定义良好的。否,这不会调用未定义的行为,预期的打印值为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
}
int&f(){
int x=5;
return x;//返回不存在的变量的引用
//f完成后
}
int main(){
std::cout当通过评估产生不确定值时,会发生未定义行为,只有少数例外(见C++14标准§8.5/12)
在这种情况下,x
的值在分配给x
之后才被使用,因此该代码没有问题。不访问x
的值以绑定对它的引用。(但是,请注意:int
也可以绑定到常量double&
,在这种情况下,将访问该值,并从该值创建一个新的临时double
对象。)关键是未初始化值上的左值到右值转换将导致UB。没有,这就是为什么没有UB:-)(当然,有右值,比如5
,0
,以及cout
行中x
的右值到左值转换的结果。)但我只是想对“使用”给出一个更精确的定义。