c ++静态模板成员初始化问题

时间:2012-09-12 09:11:17

标签: 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;
}

在这种情况下,我们将不会在stdout中输出任何内容。编译器不会生成初始化类A的float和double特化的代码。

但是......如果我们改变这样的初始化:

template<> B<float> A<float>::static_var = B<float>();
template<> B<double> A<double>::static_var = B<double>();

编译器会生成这样的代码,我们在输出中会有两个“B()”。

有人可以帮我理解这种行为吗?

1 个答案:

答案 0 :(得分:8)

n3337 14.7.3 / 13

模板的静态数据成员的显式特化是声明包含的定义 初始化;否则,它是一个声明。 [注意:模板的静态数据成员的定义 要求默认初始化必须使用braced-init-list:

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 = ...;