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

Gim*_*Eom 1 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;
Run Code Online (Sandbox Code Playgroud)

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

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

但是,如果我特意把它像这样,

A<int> A<int>::instance
Run Code Online (Sandbox Code Playgroud)

它运作良好.为什么会出现这种现象?

eca*_*mur 5

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

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

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