为什么我们不能拥有非const类级静态变量?

Meh*_*dad 3 c++ singleton static-members visual-c++

为什么Visual C++编译器拒绝编译此代码

我显然知道错误是:

错误C2864: Singleton<T>::p:
只有静态常量整型数据成员可以在类中被初始化

为什么呢?(即,是否存在技术上的原因,为什么不允许它?)
这是特定于编译器的行为还是由标准强制执行?
它似乎在全球范围内很好,为什么不在课堂范围内呢?

似乎并非所有编译器都会介意这一点.

另外,解决这个问题的正确方法是什么?

template<typename T>
struct Singleton
{
    static T *p = 0;  // Error C2864

    static T *getInstance() { /*...*/ return p; }
};
Run Code Online (Sandbox Code Playgroud)

K-b*_*llo 9

这是标准行为.只有静态const积分成员才能在没有正确定义的情况下进行初始化.需要在某处定义所有其他类型,并在定义时编写初始化:

template<typename T>
struct Singleton {
    static T *p;

    static T *getInstance() { /*...*/ return p; }
};

template<typename T>
T *Singleton<T>::p = 0;
Run Code Online (Sandbox Code Playgroud)

必须在某处定义对象.如果在类中定义它们,则在头文件中定义它们,并为包含它的每个编译单元获取不同的对象.这对于const整数类型是放宽的,如果你没有定义它们,那么编译器只是用它的文字值替换它.如果没有提供定义,那么取这样的静态const积分的地址仍会导致链接器错误.

  • @Mehrdad:因为对象**必须在某处定义.如果在类中定义它们,则在头文件中定义它们,并为包含它的每个编译单元获取不同的对象.这对于const整数类型是宽松的,如果你没有定义它们,那么编译器只是用它的文字值替换它,但是取这种静态的地址是未定义的行为. (5认同)