静态类成员是否保证在调用`main`之前初始化?

Lig*_*ica 15 c++ language-lawyer c++03

是否有任何保证静态类成员在main被调用之前被初始化?

Lig*_*ica 11

我认为不是:

[C++03: 3.6.2/3]: 无论命名空间作用域对象main的动态初始化(8.5,9.4,12.1,12.6.1)是否在第一个语句之前完成,它都是实现定义.如果初始化被推迟到第一个语句之后的某个时间点main,则它应该在第一次使用与要初始化的对象相同的转换单元中定义的任何函数或对象之前发生.


嗯,真的吗?

好吧,可以说,"在命名空间范围内定义"与"命名空间范围的对象"并不完全相同:

[C++03: 9.4.2/2]:static在类定义中声明数据成员不是定义,除了cv-qualified之外可能是不完整的类型void.数据成员的定义static应出现在包含成员类定义的命名空间范围内.在命名空间范围的定义中,static数据成员的名称应使用::运算符通过其类名进行限定. 静态数据成员定义中的初始化表达式在其类的范围内(3.3.6).

但是,它是类的范围内的初始化器 ; 没有提到static成员本身除了命名空间范围之外还有其他任何东西(除非我们精神上在任何地方注入"词汇"一词).

还有就是这个赏心悦目的段落:

[C++03: 9.4.2/7]: 静态数据成员的初始化和销毁​​与非本地对象完全相同(3.6.2,3.6.3).

然而,遗憾的是,main关于"非本地对象" 的唯一进一步的定义和静态初始化的定义是前面提到的[C++03: 3.6.2/3].


那么呢?

我相信C++ 11中的新措辞清楚地表明了这个可能含糊不清的规则的意图,它解决了所有问题:

[C++11: 9.4.2/6]: 静态数据成员的初始化和销毁​​与非局部变量(3.6.2,3.6.3)完全相同.

[C++11: 3.6.2/4]:实现定义是否在第一个main语句之前完成具有静态存储持续时间的非局部变量的动态初始化.[..]

  • @Koushik:这是一个自我回答的问题,您可以通过一次提交发布问题和答案. (3认同)