我有一些代码基本上归结为以下内容:
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)
然后我不会"使用"一个未初始化的变量,但我只是指它。
答案 0 :(得分:10)
是的,行为未定义。 在函数参数列表中传递未经初始化的double
。
通过引用传递是明确定义的,因为您所做的就是绑定对该double
的引用。当然,访问该引用的行为将未定义。
N4140:
[dcl.init]
12
...如果评估产生了不确定的值,那么 除以下情况外,行为未定义:
(省略不相关的文字,与无符号的窄字符类型有关)