オブジェクトの構築中に発生する副作用のみを目的とするクラスがあるとします (たとえば、クラスをファクトリに登録するなど)。
class SideEffectCauser {
public:
SideEffectCauser() { /* code causing side-effects */ }
};
また、いくつかの翻訳単位ごとに 1 回、オブジェクトにそのような副作用を作成させたいとします。SideEffectCauser
そのような翻訳単位ごとに、.cpp ファイルの名前空間スコープでオブジェクトを配置できるようにしたいと考えています。
SideEffectCauser dummyGlobal;
しかし、C++03 標準の 3.6.2/3 は、.cpp ファイル内のオブジェクトまたは関数が使用されない限り、このオブジェクトを構築する必要がまったくないことを示唆しています。オブジェクトが初期化されないことがあります。
一方、クラス名を保持する文字列からオブジェクトをインスタンス化する方法はありますか? SideEffectCauser
機能すると主張されているソリューションがあり、グローバルとしてではなく、静的データメンバーとしてのようなタイプのオブジェクトを使用することに基づいていることに注意してください。
class Holder {
static SideEffectHolder dummyInClass;
};
SideEffectHolder Holder::dummyInClass;
dummyGlobal
とはどちらdummyInClass
も非ローカルな静的ですが、C++03 標準の 3.6.2/3 をよく見ると、その節が名前空間スコープのオブジェクトにのみ適用されることがわかります。クラススコープの非ローカル静的が動的に初期化される時期を示すC++03標準には実際には何も見つかりませんが、9.4.2/7は、名前空間の非ローカル静的と同じ規則がそれらに適用されることを示唆しています範囲。
dummyInClass
質問 1: C++03 では、 がよりも初期化される可能性が高いと考える理由はありますdummyGlobal
か? または、同じ翻訳単位内の関数またはオブジェクトが使用されていない場合、両方が初期化されない可能性がありますか?
質問 2: C++11 で何か変更はありますか? 3.6.2 と 9.4.2 の文言は C++03 バージョンと同じではありませんが、私が知る限り、上記のシナリオで指定された動作上の違いはありません。
質問 3:SideEffectHolder
関数本体の外側のようなクラスのオブジェクトを使用して、副作用を強制的に発生させる信頼できる方法はありますか?