【发布时间】:2014-04-10 14:51:20
【问题描述】:
考虑以下代码示例:
#include <iostream>
static int bar = bar;
int main()
{
int foo = foo;
std::cout << "foo = " << foo << std::endl;
std::cout << "bar = " << bar << std::endl;
}
我收到以下编译器警告:
main.cpp: In function 'int main()':
main.cpp:7:15: warning: 'foo' is used uninitialized in this function [-Wuninitialized]
int foo = foo;
^
输出:
foo = 0
bar = 0
我预计会出现此警告,因为 foo 已被统一使用。 'foo' 可以是任何东西,而不是 0。 自分配是未定义的。
但是为什么'bar'的自赋值没有被警告呢?这个“bar”的分配是定义的还是未定义的行为?为什么?
我知道,基本数据类型的静态变量用“0”初始化,但在这种情况下,变量“bar”在其初始化期间使用。我想知道,如果这是定义的行为并且“0”是预期的输出。 (这可以解释,没有发生编译器警告)。
【问题讨论】:
-
静态初始化不止一个阶段。
-
可能是因为全局范围内的静态变量总是初始化为零,所以编译器在赋值之前就知道
bar实际上是0。 -
@FrédéricHamidi:请注意,它们不是零初始化的,而是默认构造的。这对结构/类有影响!
-
@anderas,真的,我应该说静态 primitives :)
-
@anderas AFAIK,static-storage-duration 事物在任何其他初始化发生之前被初始化为零,包括以后可能执行的默认 ctor。
标签: c++