【发布时间】:2021-08-30 21:21:11
【问题描述】:
int i = i;
int main() {
int a = a;
return 0;
}
int a = a 肯定有未定义的行为 (UB),有关它的更多详细信息在
Is reading an uninitialized value always an undefined behaviour? Or are there exceptions to it?.
但是int i = i 呢?在 C++ 中,我们可以将非常量值分配给全局变量。 i 在遇到声明之前被声明并初始化为零(因为它具有文件范围)。在这种情况下,我们稍后在定义中将0 分配给它。
可以说这没有UB吗?
【问题讨论】:
-
是的,正如你所说,这是安全的,因为静态存储持续时间的对象在任何其他初始化之前都是零初始化的
-
文件范围是来自C的一个概念。C++中对应的概念是命名空间范围。
-
初始化程序对正在初始化的标识符具有可见性的原因是递归/循环引用可能像
struct circular_list x = { &x, &x }。这就是它的用途。
标签: c++ language-lawyer undefined-behavior