[英]Is initialization of static member of a class guaranteed before initialization of a static object of that class?
[英]Is static initialization guaranteed here?
看看这段代码:
struct Foo {
void *ptr;
constexpr Foo() : ptr(nullptr) { }
};
Foo f;
是否可以保证f
将被静态初始化?
Clang在这里使用静态初始化,但MSVC 没有 。
是的,标准说f
将不断初始化:
[basic.start.init] / 2:
对象
o
常量初始化器是一个表达式,它是一个常量表达式,除了它也可以为o
及其子对象调用constexpr
构造函数,即使这些对象是非文字类类型[ 注意:这样的类可能有非-trivial destructor - end note ]。 执行常量初始化 :
...... [参考案例]
如果具有静态或线程存储持续时间的对象由构造函数调用初始化,并且初始化full-expression是对象的常量初始值设定项;
... [没有构造函数调用初始化对象的情况]
零初始化和常量初始化一起称为静态初始化 ; 所有其他初始化是动态初始化 。 在进行任何动态初始化之前,应执行静态初始化。
初始化full-expression只是调用Foo
的默认构造函数,它是一个常量表达式。
MSVC发出代码来初始化f
是错误的。
标准方面,是的。 现实,没有。
在静态初始化合规性方面,您受编译器供应商的支配。
[编辑] Clang是一个特殊的编译器 - 从一开始它的创建者一直对完全符合标准感兴趣。
如果你要将f本身声明为constexpr Foo f,我相信它也会在msvc中(至少对2015年);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.