简体   繁体   English

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

[英]Is static initialization guaranteed here?

Look at this code: 看看这段代码:

struct Foo {
        void *ptr;

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

Foo f;

Is it guaranteed that f will be statically initialized? 是否可以保证f将被静态初始化?

Clang uses static initialization here, but MSVC doesn't . Clang在这里使用静态初始化,但MSVC 没有

Yes, the Standard says f will be constant initialized: 是的,标准说f将不断初始化:

[basic.start.init]/2: [basic.start.init] / 2:

A constant initializer for an object o is an expression that is a constant expression, except that it may also invoke constexpr constructors for o 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 ]. 对象o 常量初始化器是一个表达式,它是一个常量表达式,除了它也可以为o及其子对象调用constexpr构造函数,即使这些对象是非文字类类型[ 注意:这样的类可能有非-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; 如果具有静态或线程存储持续时间的对象由构造函数调用初始化,并且初始化full-expression是对象的常量初始值设定项;

  • ... [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. 在进行任何动态初始化之前,应执行静态初始化。

The initialization full-expression is simply the call of Foo 's default constructor, which is a constant expression. 初始化full-expression只是调用Foo的默认构造函数,它是一个常量表达式。

MSVC is wrong to emit code to initialize f . MSVC发出代码来初始化f是错误的。

Standard-wise, yes. 标准方面,是的。 Reality-wise, no. 现实,没有。

You are at the mercy of compiler venders when it comes to static initialization compliance. 在静态初始化合规性方面,您受编译器供应商的支配。

[edit] Clang is a special compiler — from the beginning its creators have been interested in full standards compliance. [编辑] Clang是一个特殊的编译器 - 从一开始它的创建者一直对完全符合标准感兴趣。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM