Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器能否正确处理静态变量的初始化顺序?_C++_Static Members - Fatal编程技术网

C++ 编译器能否正确处理静态变量的初始化顺序?

C++ 编译器能否正确处理静态变量的初始化顺序?,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之前对其进行专门化,否则无法保证订单。引

下面的情况如何?如果存在依赖关系,编译器能否正确处理静态变量的初始化顺序

a、 h

b、 cpp

#包括“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;