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语句之前完成具有静态存储持续时间的非局部变量的动态初始化.[..]