我最近变得痛苦地意识到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
似乎总是首先被初始化,但我不确定如何在初始化顺序中引入噪声,以在行为未定义时增加失败的可能性。
否。将a.cpp和b.cpp链接到可执行文件的顺序*不*保证。 *表示“初始化顺序失败”。 (您的链接器可能使用字母顺序,或者它可能不会)。 –
@BoPersson我害怕这一点。谢谢。让这个答案(也许提供一个参考?),我会将它标记为接受 – stett
@BoPersson:答案去那里好友↓↓↓↓↓↓↓↓↓↓ –