我最近痛苦地意识到了Static Initialization Order Fiasco。我想知道“跨翻译单元未定义初始化顺序”的规则是否仍然适用于父类中的静态成员,而子类中的静态成员需要这些静态成员。
例如,假设我们有(为简洁起见,排除所有 # 保护和包含)
// a.h
class A {
static int count;
static int register_subclass();
};
// a.cpp
int A::count = 0;
int A::register_subclass() {
return count ++;
}
然后是 的子类A
,
// b.h
class B : public A {
static int id;
};
// b.cpp
int B::id = A::register_subclass();
这里有两个翻译单元,其中一个带有静态对象,取决于另一个初始化时的静态对象……看起来它可能是静态初始化顺序惨败的一个实例。
我的问题是:它真的安全吗?
也就是说,我是否保证没有机会包含从后者初始化之前B::id
复制的垃圾?A::count
从我自己的测试来看,A
似乎总是首先被初始化,但我不确定如何在初始化顺序中引入噪声以增加如果行为未定义的失败概率。