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

Why isn't this static member of template class initialized?

本文关键字:静态成员 初始化 为什么不      更新时间:2023-10-16
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被初始化了,但是instance没有。

但是,如果我这样专门化,

A<int> A<int>::instance

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

14.7.1隐式实例化[temp.inst]:

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

一般来说,隐式实例化是惰性的;只有那些您调用的方法和您访问的成员才会被实例化。这是一件好事,一方面是为了提高效率,另一方面是因为这意味着,例如,只对某些实例化有效的成员函数仍然可以写在通用模板中;它们只有在被调用时才会被实例化,这可能会使程序格式错误。

可以这样考虑:构建模板化对象需要在编译类型上有一个类型。当你编译这个时,编译器在实例化实例时用什么来代替T ?它不能处理T的所有可能值,所以它不会实例化任何东西。有些编译器甚至会抱怨存在实例。