为什么不使用静态模板字段,否则不会初始化?[复制]

Why aren't static template fields initialized unless used? [duplicate]

提问人:Luchian Grigore 提问时间:4/26/2012 最后编辑:CommunityLuchian Grigore 更新时间:4/27/2012 访问量:211

问:

这个问题在这里已经有答案了:
11年前关闭。

可能的重复:
(静态初始化/模板实例化)试图强制静态对象初始化的工厂模式
出现问题

编辑:有一个副本,但我会把它留出来,因为我个人很难找到它。此外,这是帮助我的答案:

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();

我本来以为当我专精时,静态字段会被初始化。但是,以下情况:Ax

A<int> a;
//no output

不会导致调用 。如果我尝试访问该成员,则行为符合预期:foo

A<int> a;
bool b = a.x;
//output: here

编辑:如何确保A::x在不访问的情况下被初始化?

C++ 模板

评论


答:

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;
    }
 };