【问题标题】:c++ static template members initialization issuec++静态模板成员初始化问题
【发布时间】:2012-09-12 09:11:16
【问题描述】:

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;
}

在这种情况下,我们在标准输出中不会有任何输出。编译器不会生成代码来初始化 A 类的浮点数和双重特化。

但是.. 如果我们像这样更改初始化:

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

编译器将生成这样的代码,我们将在输出中包含双“B()”。

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

【问题讨论】:

    标签: c++ gcc initialization static-members static-initialization


    【解决方案1】:

    n3337 14.7.3/13

    如果声明包含 初始化器;否则,它是一个声明。 [注意:模板的静态数据成员的定义 需要默认初始化必须使用花括号初始化列表:

    template<> X Q<int>::x; // declaration
    template<> X Q<int>::x (); // error: declares a function
    template<> X Q<int>::x { };// definition
    

    —结束注释]

    braced-init-listC++11 功能,所以在C++03 中只能使用

    template<> X Q<int>::x = ...;
    

    【讨论】:

    • 那么如果x要被默认构造函数(没有C++11)初始化怎么办?
    猜你喜欢
    • 2012-02-02
    • 2021-10-21
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多