c++ - 静态变量的初始化

  显示原文与译文双语对照的内容
0 0

请考虑下面的代码示例:

#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是unitialised使用。 而不是0,'foo'可为任意内容。 自我赋值是未定义的。

但是为何不提示'bar'的自主分配? 是本地'bar'定义或未定义行为,目的何在?

我知道静态变量elementar的数据类型初始化为'0'但在本例中,变量'bar'是其initialisation期间使用。 我一直在想,如果这是定义行为和'0'是预期输出。 ( 这可以解释吧,没有则会出现编译器警告) 。

Link要Live示例

时间:原作者:6个回答

0 0

我相信,标准是与你的问题相关的一部分( §3 .6 .2/2 ) :

变量具有静态存储持续时间( 3 .7 。1 ) 或线程存储持续时间( 3 .7 。2 ) 应该为零初始化( 8 。5 ) 任何其他初始化之前发生.[ .. .]

所以在这种情况下,甚至在编译器会根据你的定义 bar,它已经零初始化它。

因为它指定了一个位的标准,应该有两个阶段中进一步静态变量初始化( 强调我的) 。

同时,零初始化和常量初始化称为静态初始化,其他所有初始化已动态初始化静态初始化应该执行任何动态初始化之前发生

原作者:
...