如果不使用静态成员,静态成员变量是否在模板类中初始化?我用它来注册类型。
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() 未被调用,静态成员未初始化。我的测试是在VC110编译器上进行的。而且我也测试了一下online http://ideone.com/r9fVCW
#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++ 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf受到14
模板这是14.7.1
隐式实例化段落2其中说(强调我的):
除非类模板或成员模板的成员已显式实例化或显式特化,否则当在需要成员定义存在的上下文中引用特化时,会隐式实例化该成员的特化;尤其,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非静态数据成员本身的使用方式需要静态数据成员的定义存在。
我们还可以看到段落8其中说:
类模板的隐式实例化不会导致该类的任何静态数据成员被隐式实例化。
但是,如果您添加一个显式实例化对于第二种情况,如下所示,您将看到2
结果:
template<> bool A<int>::d = [](){regist<A<int>>(); return true;}();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)