私は最近、 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();
ここには2つの翻訳単位があり、一方は静的オブジェクトに依存し、他方は初期化時に静的オブジェクトに依存しています...静的初期化順序の大失敗のインスタンスのようです。
私の質問は:それは実際に安全ですか?
つまり、後者が初期化される前にB::id
コピーされたジャンクが含まれる可能性がないことを保証できますか? A::count
私自身のテストでは、A
常に最初に初期化されるように見えますが、初期化の順序でノイズを導入して、動作が未定義の場合に失敗する可能性を高める方法がわかりません。