[英]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,因此應該在編譯時可用,因此在啟動時應該沒有“初始化順序”問題。
這段代碼是正確的還是初始化順序問題仍然存在?
如果變量或臨時 object 與 static 或線程存儲持續時間是常量初始化,則執行常量初始化。 [...] 零初始化和常量初始化一起稱為 static 初始化; 所有其他初始化都是動態初始化。 所有 static 初始化強烈發生在 ([intro.races]) 任何動態初始化之前。
所以,“這段代碼正確嗎?”:是的,因為my_array
是常量初始化的,這發生在動態初始化( my_map
)之前。
(此引用來自當前的標准草案,但此規則也適用於 C++14)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.