これは私の問題の簡略化された形式です(実際のライブラリに基づく):
// class template with static member variable:
template <typename T>
struct X
{
static std::vector<T> v_;
};
// definition of that static member variable:
template <typename T>
std::vector<T> X<T>::v_{};
// explicit instantiation of the class template:
template struct X<int>;
// library initialization function that fills v_ for X<int>:
static bool init()
{
X<int>::v_.reserve(1000);
...
return true;
}
// automatic initialization:
static bool initialized = init();
私の質問は、関数が呼び出されるX<int>::v_
前に初期化されるこの場合 (単一の翻訳単位) — 定義とインスタンス化の順序によって — が保証されているかどうかです。init()
私の知る限り、静的変数は定義順に単一の翻訳単位で初期化されますが、テンプレートと明示的なインスタンス化はそれについて何かを変えることができますか? その明示的なインスタンス化が削除されたらどうなるでしょうか? それとも、ソースコードの最後に置く?