可能重复:
(static initialization/template instantiation) problems with factory pattern
trying to force static object initialization
https://stackoverflow.com/a/2852234/673730
假设以下课程:
template<class X>
struct A
{
static bool x;
static bool foo()
{
cout << "here";
return true;
}
};
template<class X>
bool A<X>::x = A<X>::foo();
我会假设当我专攻A
时,静态字段x
会被初始化。但是,以下内容:
A<int> a;
//no output
不会调用foo
。如果我尝试访问该成员,则行为符合预期:
A<int> a;
bool b = a.x;
//output: here
编辑:如何确保A::x
在未访问的情况下进行初始化?
答案 0 :(得分:12)
如果模板由于被实例化而隐式专门化,那么只有那些实际被引用的成员才会被实例化。
将此与显式类模板实例化(template struct A<int>;
)进行对比,后者实例化并为所有成员创建代码。 (您也可以单独仅实例化特定成员:template bool A<int>::x;
。)
答案 1 :(得分:1)
这是思想的参考(14.7.1.2):
除非已经显式实例化或明确专门化了类模板或成员模板的成员,否则在需要成员定义存在的上下文中引用特化时,将隐式实例化成员的特化;特别是,除非静态数据成员本身以需要静态数据成员定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用)。
template<class X, bool y>
struct A
{
static cosnt bool x = y;
static bool foo()
{
cout << "here";
return true;
}
};