gpt4 book ai didi

c++ - 使用 constexpr 进行全局初始化顺序

转载 作者:行者123 更新时间:2023-12-01 20:26:16 24 4
gpt4 key购买 nike

让我们考虑一下这段代码,它只是尝试从 constexpr 数组初始化映射:

#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] :

Constant initialization is performed if a variable or temporary object with static or thread storage duration is constant-initialized. [...] Together, zero-initialization and constant initialization are called static initialization; all other initialization is dynamic initialization. All static initialization strongly happens before ([intro.races]) any dynamic initialization.

那么,“这段代码正确吗?”:是的,因为 my_array 是常量初始化的,并且这发生在动态初始化 (my_map) 之前。

(此引用来自当前的标准草案,但此规则也适用于 C++14)

关于c++ - 使用 constexpr 进行全局初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58260263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com