下面的案例呢?如果存在依赖关系,编译器能否正确处理静态变量的初始化顺序?
啊
template<class T>
struct A { static double a; };
template<class T>
double A<T>::a = 1;
bh
struct B { static double b; };
b.cpp
#include "b.h"
#include "a.h"
double B::b = A<int>::a;
下面的案例呢?如果存在依赖关系,编译器能否正确处理静态变量的初始化顺序?
啊
template<class T>
struct A { static double a; };
template<class T>
double A<T>::a = 1;
bh
struct B { static double b; };
b.cpp
#include "b.h"
#include "a.h"
double B::b = A<int>::a;
在这种情况下,因为a
是静态初始化的,所以没有问题;这保证在动态初始化之前发生b
。
更一般地说,在两者都需要动态初始化的情况下,这是一个问题。除非您在使用模板成员进行初始化之前对其进行专门化b
,否则无法保证顺序。引用标准(C++11 3.6.2/2):
显式专门化的类模板静态数据成员的定义已排序初始化。其他类模板静态数据成员(即隐式或显式实例化的特化)具有无序初始化。
在您的示例中,A<int>::a
是静态初始化的,并且所有静态初始化都发生在任何动态初始化之前。 B::b
是动态初始化的,所以它会在A<int>::a
初始化之后发生,一切都很好。