如果不使用静态成员,静态成员变量是否在模板类中初始化?我用它来注册类型。

template<class T>
class A
{
    static bool d;
};

template<class T> bool A<T>::d = [](){regist<A<T>>(); return true;}();

int main()
{
   A<int> a;
   return 0;
}

我找到了一种方法来测试它。它打印 1 而非 2。 regist() 未调用 abd 静态成员未初始化。我的测试是在 VC110 编译器上进行的。我也测试了 online
#include <iostream>
using namespace std;

int i = 1;

template<class T>
void regist()
{
    ++i;
}

template<class T>
class A
{
    static bool d;
};

template<class T> bool A<T>::d = [](){regist<A<T>>(); return true;}();

int main()
{
    A<int> a;
    cout << i << endl;
    return 0;
}

最佳答案

C++ draft standard 的相关部分属于 14 模板,即 14.7.1 隐式实例化第 2 段,其中说(强调我的):



我们还可以看到第 8 段说:



但是,如果您向第二种情况添加显式实例化,如下所示,您将看到 2 作为结果:

template<> bool A<int>::d = [](){regist<A<int>>(); return true;}();

关于c++ - 如果不使用静态成员,静态成员变量是否在模板类中初始化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19341360/

10-11 03:57