Rib*_*oks 10 c++ gcc initialization static-members static-initialization
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;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们将不会在stdout中输出任何内容.编译器不会生成代码来初始化类A的float和double特化.
但是..如果我们要改变这样的初始化:
template<> B<float> A<float>::static_var = B<float>();
template<> B<double> A<double>::static_var = B<double>();
Run Code Online (Sandbox Code Playgroud)
编译器将生成这样的代码,我们将在输出中有两个"B()".
有人可以帮助我理解这种行为吗?
n3337 14.7.3/13
如果声明包含初始化器,则模板的静态数据成员的显式特化是定义; 否则,这是一个声明.[注意:需要默认初始化的模板的静态数据成员的定义必须使用braced-init-list:
Run Code Online (Sandbox Code Playgroud)template<> X Q<int>::x; // declaration template<> X Q<int>::x (); // error: declares a function template<> X Q<int>::x { };// definition- 结束说明]
braced-init-list是C++11功能,所以C++03你只能使用
template<> X Q<int>::x = ...;
Run Code Online (Sandbox Code Playgroud)