[英]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.