gcc 4.5.1、SuSE Linux i686
次のコードがあるとします。
template<typename realT> class B
{
public:
B() {std::cout << "B()" << std::endl;}
};
template<typename realT> class A
{
public:
static B<realT> static_var;
};
template<typename realT> B<realT> A<realT>::static_var;
template<> B<float> A<float>::static_var;
template<> B<double> A<double>::static_var;
int main()
{
A<float> test;
return 0;
}
この場合、stdout には何も出力されません。コンパイラは、クラス A の float および double 特殊化を初期化するコードを生成しません。
しかし..次のように初期化を変更すると:
template<> B<float> A<float>::static_var = B<float>();
template<> B<double> A<double>::static_var = B<double>();
コンパイラはそのようなコードを生成し、出力には二重の「B()」が含まれます。
誰かがそのような行動を理解するのを手伝ってくれますか?