是否在明确定义的函数参数列表中传递未初始化的变量
Is passing an uninitialised variable in a function parameter list well-defined?
我有一些代码,基本上可以归结为以下内容:
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
...... 如果评估生成不确定值,则 行为未定义,但以下情况除外:
(省略不相关的文本,涉及无符号的窄字符类型)
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持