是否在函数参数列表中传递未初始化的变量?

时间:2014-12-11 11:09:27

标签: c++ language-lawyer

我有一些代码基本上归结为以下内容:

void bar(bool b, double f)
{
    if (b){
        double g = f;
    }
}

void foo()
{
    double f;
    bool b = false;
    bar(b, f);
}

这里有未定义的行为吗?我怀疑可能会因为我在将double传递给f时获取未初始化的bar的有效副本。也就是说,我没有使用传递的double,因为if块不会运行。

此外,如果我通过引用传递double,一切都会好起来的:

void bar(bool b, double& f)

然后我不会"使用"一个未初始化的变量,但我只是指它。

1 个答案:

答案 0 :(得分:10)

是的,行为未定义。 在函数参数列表中传递未经初始化的double

通过引用传递是明确定义的,因为您所做的就是绑定对该double的引用。当然,访问该引用的行为未定义。

N4140:

[dcl.init]

  

12 ...如果评估产生了不确定的值,那么   除以下情况外,行为未定义:

(省略不相关的文字,与无符号的窄字符类型有关)