它是未定义的行为传递引用未初始化的变量?

And*_*Sun 7 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;
}
Run Code Online (Sandbox Code Playgroud)

此代码是否在C++中调用未定义的行为?g ++编译它没有任何警告,代码打印出来5(如预期的那样?).

Rem*_*eau 12

此代码中没有未定义的行为.在为其分配值之前使用未初始化的变量将是未定义的,但它被定义为传递引用并通过引用执行赋值.


Bri*_*ian 5

当评估产生不确定值时会发生未定义的行为,但有一些例外(参见C++ 14标准的§8.5/ 12).

在这种情况下,x直到x分配后才使用值,所以这段代码没问题.x不访问值以绑定对它的引用.(但是,请注意:a int也可以绑定到a const double&,在这种情况下,访问该值,并double从该值创建新的临时对象.)