强制初始化Singleton类

时间:2013-10-18 13:19:36

标签: c++

我正在跟踪一些遗留代码,我在Singleton类的.cpp文件中找到了这个,

namespace
{
    bool forceInit = (CFoo::getInstance(), true);
}

这段代码是什么意思?这是单例类的强制初始化吗?为什么代码存在?

由于

1 个答案:

答案 0 :(得分:5)

考虑以下代码(注意:C ++ 11代码!):

#include <iostream>

struct Singleton
{
  Singleton()
  {
    std::cout << "init singleton" << std::endl;
  }

public:
  static Singleton& Instance()
  {
    static Singleton instance;
    return instance;
  }
};

namespace
{
  bool forceInit = (Singleton::Instance(), true);
}

int main()
{
  std::cout << "enter main" << std::endl;
  return 0;
}

效果是:初始化forceInit时,调用Singleton::Instance(),丢弃非const引用,并将forceInit设置为true。发生这种情况的原因是因为命名空间级别变量在进入main()之前已静态初始化。

问题在于你不能这么做:

namespace
{
  Singleton::Instance();
}

可以这样做:

namespace
{
  Singleton& singRef = Singleton::Instance();
}

但是,我认为作者不想将单身实际引用到翻译单元中。逗号运算符允许调用Instance()而不实际初始化对单例的静态实例的引用。

编辑:关于这样做的具体原因,如果没有评论,作者可能仍然是唯一知道他们想要的人。

EDIT2 :啊,BTW,上面的程序打印

init singleton
enter main

......正如预期的那样。