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
的右值到左值转换的结果。)但我只是想对“使用”给出一个更精确的定义。