6

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

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

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在不访问它的情况下进行初始化?

4

2 回答 2

12

如果一个模板由于被实例化而被隐式特化,那么只有那些实际引用的成员被实例化。

将此与显式类模板实例化 ( )进行对比,后者为所有成员template struct A<int>;实例化并创建代码。(您也可以仅单独实例化特定成员:。)template bool A<int>::x;

于 2012-04-26T13:01:07.903 回答
1

这个想法是参考(14.7.1.2):

除非类模板或成员模板的成员已被显式实例化或显式特化,否则当在需要成员定义存在的上下文中引用特化时,成员的特化将被隐式实例化;特别是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非该静态数据成员本身的使用方式要求该静态数据成员的定义存在。

template<class X, bool y>
struct A
{
    static cosnt bool x = y;
    static bool foo()
    {
       cout << "here";
       return true;
    }
 };
于 2012-04-26T13:09:35.507 回答