Ozn*_*nOg 6 c++ constexpr c++14
让我们考虑一下这些简单的代码,它们只是尝试从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
}
Run Code Online (Sandbox Code Playgroud)
我知道没有办法预测两个变量(my_array和my_map)的初始化顺序。就是说,my_array是constexpr,因此应该在编译时可用,因此启动时应该没有“初始化顺序”问题。
这段代码正确还是初始化顺序问题仍然存在?
如果具有静态或线程存储持续时间的变量或临时对象被常量初始化,则执行常量初始化。[...] 零初始化和常量初始化一起称为静态初始化;所有其他初始化都是动态初始化。所有静态初始化都强烈发生在([intro.races])任何动态初始化之前。
那么,“这段代码正确吗?”:是的,正如my_array常量初始化一样,并且这发生在动态初始化(my_map)之前。
(此引用来自当前的标准草案,但此规则也适用于 C++14)