3

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

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;
4

2 回答 2

5

在这种情况下,因为a是静态初始化的,所以没有问题;这保证在动态初始化之前发生b

更一般地说,在两者都需要动态初始化的情况下,这一个问题。除非您在使用模板成员进行初始化之前对其进行专门化b,否则无法保证顺序。引用标准(C++11 3.6.2/2):

显式专门化的类模板静态数据成员的定义已排序初始化。其他类模板静态数据成员(即隐式或显式实例化的特化)具有无序初始化

于 2013-09-16T18:52:39.733 回答
1

在您的示例中,A<int>::a是静态初始化的,并且所有静态初始化都发生在任何动态初始化之前。 B::b是动态初始化的,所以它会在A<int>::a初始化之后发生,一切都很好。

于 2013-09-16T18:50:10.647 回答