看看这段代码:
struct Foo {
void *ptr;
constexpr Foo() : ptr(nullptr) { }
};
Foo f;
保证f
会静态初始化吗?
在这里,Clang使用静态初始化,但MSVC不使用。
f
将被常量初始化:o
的常量表达式初始化,但它也可以调用o
及其子对象的constexpr
构造函数,即使这些对象是非字面类类型[注意:这样的类可能具有非平凡的析构函数--end note]。进行常量初始化的情况包括:Foo
的默认构造函数,这是一个常量表达式。f
的代码是错误的。从标准的角度来看,是的。但从现实情况来看,则不然。
在涉及静态初始化遵从性时,你要完全依赖于编译器供应商的恩惠。
[编辑] Clang 是一款特殊的编译器 - 从一开始,它的创作者就一直关注着完整的标准遵从性。
我相信如果你将f本身声明为constexpr Foo f;,它也会在msvc(至少vs 2015)中出现。
f
以外。 - aschepler