C++ 编译器能否正确处理静态变量的初始化顺序?
下面的情况如何?如果存在依赖关系,编译器能否正确处理静态变量的初始化顺序 a、 h b、 cppC++ 编译器能否正确处理静态变量的初始化顺序?,c++,static-members,C++,Static Members,下面的情况如何?如果存在依赖关系,编译器能否正确处理静态变量的初始化顺序 a、 h b、 cpp #包括“b.h” #包括“a.h” 双B::B=A::A; 在您的示例中,A::A是静态初始化的,所有静态初始化都发生在任何动态初始化之前B::B是动态初始化的,因此它将在A::A初始化后发生,并且一切正常。在这种情况下,没有问题,因为A是静态初始化的;这保证在动态初始化b之前发生 更一般地说,当两者都需要动态初始化时,这是一个问题。除非在使用模板成员初始化b之前对其进行专门化,否则无法保证订单。引
#包括“b.h”
#包括“a.h”
双B::B=A::A;
在您的示例中,A::A
是静态初始化的,所有静态初始化都发生在任何动态初始化之前B::B
是动态初始化的,因此它将在A::A
初始化后发生,并且一切正常。在这种情况下,没有问题,因为A
是静态初始化的;这保证在动态初始化b
之前发生
更一般地说,当两者都需要动态初始化时,这是一个问题。除非在使用模板成员初始化b
之前对其进行专门化,否则无法保证订单。引用标准(C++11 3.6.2/2):
显式专用类模板静态数据成员的定义具有有序初始化。其他类模板静态数据成员(即隐式或显式实例化的专门化)具有无序初始化
另外:在这种情况下,没有问题,因为
a
是静态初始化的。大概,你是在问更一般的情况,两者都需要动态初始化?@Mike Seymour:B::B
的初始化不是动态的吗,因为A::A
不是一个常量表达式?@VaughnCato:你是对的;我应该说“没有问题,因为a
是静态初始化的”。
template<class T>
struct A { static double a; };
template<class T>
double A<T>::a = 1;
struct B { static double b; };
#include "b.h"
#include "a.h"
double B::b = A<int>::a;