3

静的メンバーが使用されていない場合、静的メンバー変数はテンプレート クラスで初期化されますか? タイプを登録するために使用します。

template<class T>
class A
{
    static bool d;
};

template<class T> bool A<T>::d = [](){regist<A<T>>(); return true;}();

int main()
{
   A<int> a;
   return 0;
}

私はそれをテストする方法を見つけます。2 以外の 1 を出力します。regist() は呼び出されず、静的メンバーは初期化されません。私のテストはVC110コンパイラーで行われています。また、オンラインでテストします

#include <iostream>
using namespace std;

int i = 1;

template<class T>
void regist()
{
    ++i;
}

template<class T>
class A
{
    static bool d;
};

template<class T> bool A<T>::d = [](){regist<A<T>>(); return true;}();

int main()
{
    A<int> a;
    cout << i << endl;
    return 0;
}
4

2 に答える 2

3

C++ドラフト標準の関連セクションは、14 テンプレートの下にあり、これは14.7.1 暗黙のインスタンス化の段落2であり、次のように述べています(強調鉱山):

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

パラグラフ8にも次のように書かれています。

クラス テンプレートの暗黙的なインスタンス化によって、そのクラスの静的データ メンバーが暗黙的にインスタンス化されることはありません。

ただし、次のように 2 番目のケースに明示的なインスタンス化を追加する2と、結果が表示されます。

template<> bool A<int>::d = [](){regist<A<int>>(); return true;}();
于 2013-10-13T03:41:22.253 に答える