簡體   English   中英

使用 constexpr 的全局初始化順序

[英]global initialization order with constexpr

讓我們考慮一下這段代碼,它只是嘗試從 constexpr 數組中初始化 map:

#include <string>
#include <map>
#include <array>
#include <tuple>

constexpr std::array<std::pair<int, const char *>, 10> my_array {
    { { 0, "dd" },
    { 1, "dd" },
    { 2, "dd" },
    { 7, "dd" },
    { 8, "dd" },
    { 9, "dd" }}
   };

std::map<int, std::string> my_map(std::begin(my_array), std::end(my_array));

int main() {
    return my_map[0].size(); //dummy random operation
}

我知道沒有辦法預測兩個變量(my_array 和 my_map)的初始化順序。 也就是說,my_array 是 constexpr,因此應該在編譯時可用,因此在啟動時應該沒有“初始化順序”問題。

這段代碼是正確的還是初始化順序問題仍然存在?

[basic.start.static/2]

如果變量或臨時 object 與 static 或線程存儲持續時間是常量初始化,則執行常量初始化。 [...] 零初始化和常量初始化一起稱為 static 初始化; 所有其他初始化都是動態初始化。 所有 static 初始化強烈發生在 ([intro.races]) 任何動態初始化之前

所以,“這段代碼正確嗎?”:是的,因為my_array是常量初始化的,這發生在動態初始化( my_map )之前。

(此引用來自當前的標准草案,但此規則也適用於 C++14)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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