除非使用,否则为什么不初始化静态模板字段?

时间:2012-04-26 12:56:25

标签: c++ templates

  

可能重复:
  (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在未访问的情况下进行初始化?

2 个答案:

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