是否在明确定义的函数参数列表中传递未初始化的变量

Is passing an uninitialised variable in a function parameter list well-defined?

本文关键字:变量 初始化 列表 参数 定义 函数 是否      更新时间:2023-10-16

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

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

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

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

void bar(bool b, double& f)

然后,我不是在"使用"未初始化的变量,而只是在引用它。

是的,行为是未定义的。在函数参数列表中传递未初始化double时,您正在获取该值副本。

按引用传递明确定义的,因为您所做的只是将该引用绑定到该double。当然,访问该引用的行为不确定的。

N4140:

[dcl.init]

12...... 如果评估生成不确定值,则 行为未定义,但以下情况除外:

(省略不相关的文本,涉及无符号的窄字符类型)