C++ 为什么模板的静态成员在同一翻译单元中稍后定义的对象之后初始化?

C++ 为什么模板的静态成员在同一翻译单元中稍后定义的对象之后初始化?,c++,templates,initialization,C++,Templates,Initialization,考虑以下(人工)示例: 这表明global的动态初始化在S::I>的初始化之前运行。但据报道, 在同一翻译单元中定义的对象(通常指.cpp文件)按其定义的顺序进行初始化 为什么global的动态初始化在S::I>的动态初始化之前运行,而不是按照它们的定义顺序运行,并且可以强制global在之后初始化吗?因为,S::I的值可以是0(如果是在global之后初始化的话)或42(如果在全局之前初始化) 虽然您不能强制编译器在global之前初始化I,但只要稍微更改代码,您就可以使用用于排序在不同转换单

考虑以下(人工)示例:

这表明
global
的动态初始化在
S::I>
的初始化之前运行。但据报道,

在同一翻译单元中定义的对象(通常指.cpp文件)按其定义的顺序进行初始化


为什么
global
的动态初始化在
S::I>
的动态初始化之前运行,而不是按照它们的定义顺序运行,并且可以强制
global
在之后初始化吗?

因为,
S::I
的值可以是0(如果是在
global
之后初始化的话)或42(如果在全局之前初始化)

虽然您不能强制编译器在
global
之前初始化
I
,但只要稍微更改代码,您就可以使用用于排序在不同转换单元中定义的静态变量的相同方法。通过将
I
更改为将其值存储在内部静态变量中的函数,您可以确保在全局之前初始化

template <typename T>
struct S {
  static int I() {
    static int i = f();
    return i;
  }
};

template <typename T>
int g() {
  return S<T>::I();
}
模板
结构{
静态int I(){
静态int i=f();
返回i;
}
};
模板
int g(){
返回S::I();
}

(VS2015给出了0)我想知道这里是否有任何技巧来强制进行所需的初始化。“为什么全局的动态初始化要先于S::I>的动态初始化运行,而不是按照其定义的顺序运行”因为
template int S::I=f();
不是一个定义,它是在您调用
g()时实例化它时定义的
这是在
global
定义之后
$ g++ test.cc
$ ./a.out
0
template <typename T>
struct S {
  static int I() {
    static int i = f();
    return i;
  }
};

template <typename T>
int g() {
  return S<T>::I();
}