6

重複の可能性: (静的初期化/テンプレートのインスタンス化)静的オブジェクトの初期化を強制しようとする
ファクトリ パターンの問題

編集:これの複製がありますが、私は個人的にそれを見つけるのに苦労したので、これを残します. さらに、私を助けた答えは次のとおりです。

https://stackoverflow.com/a/2852234/673730

次のクラスを想定します。

template<class X>
struct A
{
   static bool x;
   static bool foo()
   {
      cout << "here";
      return true;
   }
};

template<class X>
bool A<X>::x = A<X>::foo();

を特化するAと、静的フィールドxが初期化されると想定していました。ただし、次のとおりです。

A<int> a;
//no output

への呼び出しにはなりませんfoo。メンバーにアクセスしようとすると、動作は期待どおりです。

A<int> a;
bool b = a.x;
//output: here

編集:アクセスせずに初期化されていることを確認するにはどうすればよいですか?A::x

4

2 に答える 2

12

テンプレートがインスタンス化によって暗黙的に特殊化されている場合、実際に参照されているメンバーのみがインスタンス化されます。

これを、すべてのメンバーのコードをインスタンス化して作成する明示的なクラス テンプレートのインスタンス化 ( ) と比較してください。(特定のメンバーのみを個別にインスタンス化することもできます: .)template struct A<int>;template bool A<int>::x;

于 2012-04-26T13:01:07.903 に答える
1

これは参照(14.7.1.2)だと思います:

クラス テンプレートまたはメンバー テンプレートのメンバーが明示的にインスタンス化または明示的に特殊化されていない限り、メンバー定義が存在する必要があるコンテキストで特殊化が参照されると、メンバーの特殊化は暗黙的にインスタンス化されます。特に、静的データ メンバーの定義が存在する必要がある方法で静的データ メンバー自体が使用されない限り、静的データ メンバーの初期化 (および関連する副作用) は発生しません。

template<class X, bool y>
struct A
{
    static cosnt bool x = y;
    static bool foo()
    {
       cout << "here";
       return true;
    }
 };
于 2012-04-26T13:09:35.507 に答える