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