考虑
//#include stuff
const int x=5;
.
.
int main()
{
static int var=x;
.
.
}
如果我理解正确,
static int var;
单独将var
设置为零,static int var=x;
也将var
设置为{{ 1}}起初。zero
执行一个常量表达式初始化,在零初始化之后完成IIRC。静态变量static int var=x;
- 虽然这句话自相矛盾吗?
答案 0 :(得分:5)
C ++ 14指出:
3.6.2非局部变量的初始化
...
具有静态存储持续时间(3.7.1)或线程存储的变量 持续时间(3.7.2)应为零初始化(8.5) 在进行任何其他初始化之前。
好的,这似乎是这个问题的基础。
执行常量初始化:
[...]
接下来是常量初始化的定义。长话短说,const int x=5;
和static int var=x;
似乎都符合持续初始化的要求。
因此,基于此,这似乎表明“静态变量[被]多次初始化”。
向前迈进:
一起调用零初始化和常量初始化 静态初始化;所有其他初始化是动态的 初始化。静态初始化应在任何之前执行 动态初始化发生。
因此,零初始化和常量初始化(这里是主题的“多个”初始化)必须在动态初始化之前 。
由此,我得出结论,虽然从技术上讲,“静态变量[多次初始化多次”的说法]是正确的,但我认为没有任何方法可以实际观察它。您需要动态初始化来观察某些事情。在静态初始化完成之前,不会进行动态初始化。
从这一点来看,它看起来像3.6.2中定义的术语“静态初始化”,与“静态初始化惨败”中的“静态初始化”并不完全相同。在我看来,“静态初始化惨败”应该被称为“动态初始化惨败”。