看这段代码:
struct Foo {
void *ptr;
constexpr Foo() : ptr(nullptr) { }
};
Foo f;
是否保证f
会被静态初始化?
Clang 在这里使用静态初始化,但是 MSVC doesn't .
最佳答案
是的,标准说 f
将被常量初始化:
[basic.start.init]/2:
A constant initializer for an object
o
is an expression that is a constant expression, except that it may also invokeconstexpr
constructors foro
and its subobjects even if those objects are of non-literal class types [Note: such a class may have a non-trivial destructor --end note]. Constant initialization is performed:
... [a case for references]
if an object with static or thread storage duration is initialized by a constructor call, and if the initialization full-expression is a constant initializer for the object;
... [a case for objects initialized without a constructor call]
Together, zero-initialization and constant initialization are called static initialization; all other initialization is dynamic initialization. Static initialization shall be performed before any dynamic initialization takes place.
初始化全表达式只是调用Foo
的默认构造函数,它是一个常量表达式。
MSVC 发出初始化 f
的代码是错误的。
关于c++ - 这里保证静态初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46379738/