提问人:Luchian Grigore 提问时间:4/26/2012 最后编辑:CommunityLuchian Grigore 更新时间:4/27/2012 访问量:211
为什么不使用静态模板字段,否则不会初始化?[复制]
Why aren't static template fields initialized unless used? [duplicate]
问:
可能的重复:
(静态初始化/模板实例化)试图强制静态对象初始化的工厂模式
出现问题
编辑:有一个副本,但我会把它留出来,因为我个人很难找到它。此外,这是帮助我的答案:
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
在不访问的情况下被初始化?
答:
12赞
Kerrek SB
4/26/2012
#1
如果模板由于被实例化而隐式专用,则仅实例化实际引用的那些成员。
与此形成鲜明对比的是显式类模板实例化 (),后者为所有成员实例化和创建代码。(也可以单独仅实例化特定成员:。template struct A<int>;
template bool A<int>::x;
1赞
ManiP
4/26/2012
#2
这个想法是参考(14.7.1.2):
除非类模板或成员模板的成员已显式实例化或显式专用化,否则在要求成员定义存在的上下文中引用专用化时,将隐式实例化成员的专用化;具体而言,除非静态数据成员本身的使用方式要求静态数据成员的定义存在,否则不会发生静态数据成员的初始化(以及任何关联的副作用)。
template<class X, bool y>
struct A
{
static cosnt bool x = y;
static bool foo()
{
cout << "here";
return true;
}
};
评论