这里是否保证静态初始化?

时间:2017-09-23 12:47:05

标签: c++

看看这段代码:

struct Foo {
        void *ptr;

        constexpr Foo() : ptr(nullptr) { }
};

Foo f;

是否可以保证f将被静态初始化?

Clang在这里使用静态初始化,但MSVC doesn't

3 个答案:

答案 0 :(得分:3)

是的,标准说f将不断初始化:

[basic.start.init] / 2:

  

对象o常量初始值设定项是一个表达式,它是一个常量表达式,除了它还可以为constexpr及其o调用Foo构造函数子对象即使这些对象是非文字类类型[注意:这样的类可能有一个非平凡的析构函数 - 结束注释]。 执行常量初始化

     
      
  • ... [参考案例]

  •   
  • 如果具有静态或线程存储持续时间的对象由构造函数调用初始化,并且初始化full-expression是对象的常量初始值设定项;

  •   
  • ... [没有构造函数调用初始化对象的情况]

  •   
     

一起,零初始化和常量初始化称为静态初始化;所有其他初始化都是动态初始化。在进行任何动态初始化之前,应执行静态初始化。

初始化full-expression只是调用f的默认构造函数,它是一个常量表达式。

MSVC发出代码以初始化max是错误的。

答案 1 :(得分:0)

标准方面,是的。现实,没有。

在静态初始化合规性方面,你受编译器供应商的支配。

[edit] Clang是一个特殊的编译器 - 从一开始它的创作者就对完全符合标准感兴趣。

答案 2 :(得分:0)

我相信如果你要将f本身声明为constexpr Foo f,那么它也将在msvc中(至少与2015年相比);