是否对按引用传递未初始化的变量进行未定义的行为



我有以下代码:

#include <iostream>
void f(int &x) {
    x = 5;
}
int main() {
    int x;
    f(x);
    std::cout << x << std::endl;
    return 0;
}

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

此代码中没有未定义的行为。 在为变量赋值之前使用未初始化的变量是未定义的,但通过引用传递引用和执行赋值是明确定义的。

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

在这种情况下,x 的值直到分配给 x 之后才会使用,因此此代码很好。访问 x 的值不会为了绑定引用。(但是,请注意:int也可以绑定到const double&,在这种情况下,访问该值,并从该值创建新的临时double对象。

否,这不会调用未定义的行为,预期的打印值为 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()完成后,引用将指向无效内存。

最新更新