簡體   English   中英

這里是否保證靜態初始化?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM