C++ 显式实例化模板的静态成员和另一个静态变量的初始化顺序

C++ 显式实例化模板的静态成员和另一个静态变量的初始化顺序,c++,templates,explicit-instantiation,static-order-fiasco,C++,Templates,Explicit Instantiation,Static Order Fiasco,这是我的问题的简化形式(基于真实的库): //带有静态成员变量的类模板: 模板 结构X { 静态std::向量v_; }; //该静态成员变量的定义: 模板 std::vector X::v_{}; //类模板的显式实例化: 模板结构X; //为X填充v_u的库初始化函数: 静态bool init() { X::v_.储备(1000); ... 返回true; } //自动初始化: 静态bool initialized=init(); 我的问题是,在这种情况下(单个翻译单元)——按照定义和实例

这是我的问题的简化形式(基于真实的库):

//带有静态成员变量的类模板:
模板
结构X
{
静态std::向量v_;
};
//该静态成员变量的定义:
模板
std::vector X::v_{};
//类模板的显式实例化:
模板结构X;
//为X填充v_u的库初始化函数:
静态bool init()
{
X::v_.储备(1000);
...
返回true;
}
//自动初始化:
静态bool initialized=init();
我的问题是,在这种情况下(单个翻译单元)——按照定义和实例化的顺序——是否可以保证在调用
init()
函数之前初始化
X::v


好吧,静态变量是按照定义的顺序在单个转换单元中初始化的,但是模板和显式实例化能改变它吗?如果该显式实例化被删除了呢?或者,放在源代码的末尾?

如果变量是隐式或显式实例化的专用化,则具有静态存储持续时间的非局部变量的动态初始化是无序的;如果变量是不是隐式或显式实例化的专用化的内联变量,则动态初始化是部分有序的,否则是有序的

[注1:显式专门化的非内联静态数据成员或变量模板专门化已命令初始化。-结束注]

正如标准所指出的,
v\uu
的初始化是无序的

但我们始终可以通过
静态
功能解决此问题:

模板
结构X{
静态std::vector&v_uxcept()noexcept{
静态std::向量v;
返回v;
}
};
模板结构X;
静态bool init(){
X::v_.)储备(1000);
// ...
返回true;
}
静态bool initialized=init();

类似于单身汉的
// class template with static member variable:
template <typename T>
struct X 
{
  static std::vector<T> v_;
};

// definition of that static member variable:
template <typename T>
std::vector<T> X<T>::v_{};

// explicit instantiation of the class template:
template struct X<int>;

// library initialization function that fills v_ for X<int>:
static bool init()
{
  X<int>::v_.reserve(1000);
  ...
  return true;
}

// automatic initialization:
static bool initialized = init();