我最近變得痛苦地意識到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:答案去那裏好友↓↓↓↓↓↓↓↓↓↓ –