为什么不初始化模板类的静态成员?

时间:2014-07-25 17:03:19

标签: c++ templates static-members

template <typename T>
class A
{
    public:
    A() {p = this;}
    static A *GetP() {return p;}

    private:
    static A *p;
    static A instance;
}

template <typename T>
A<T> *A<T>::p = (A<T> *)4534;    //just test value to check whether p is initiallized or not.

template <typename T>
A<T> A<T>::instance;

我致电A<int>::GetP()。我希望它返回实例的地址, 但它返回(A<int> *)4534。 另外,没有调用构造函数。

我认为这意味着p初始化得很好,但实例不是。

但是,如果我这样特别说明,

A<int> A<int>::instance

效果很好。 为什么会出现这种现象?

2 个答案:

答案 0 :(得分:5)

14.7.1隐式实例化 [temp.inst]

  

2 - [...] [T]除非静态数据成员本身以某种方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用)   这需要静态数据成员的定义存在。 [...]
  8 - 类模板的隐式实例化不会导致该类的任何静态数据成员被隐式实例化。

通常,隐式实例化是 lazy ;只会实例化您调用的那些方法和您访问的成员。这是一件好事,部分原因在于效率,也因为它意味着只对某些实例有效的成员函数仍然可以写在通用模板中;它们只会被实例化,如果它们被调用,可能会使程序格式不正确。

答案 1 :(得分:-1)

以这种方式思考:构建模板化对象需要一个类型为compile的类型。当你编译它时,编译器在实例化实例时替换T是什么?它不能完成T的所有可能值,因此它不会实例化任何东西。一些编译器会抱怨实例甚至存在。提供int可以实际实例化某些东西。