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

时间:2016-02-10 03:33:31

标签: 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;
}

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

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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