0

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

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

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

谢谢

4

1 回答 1

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()被调用时,非constref 被丢弃,并forceInit设置为 true。发生这种情况的原因是名称空间级别的变量在进入main().

问题是你不能简单地这样做:

namespace
{
  Singleton::Instance();
}

可以这样做:

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

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

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

EDIT2:啊,顺便说一句,上面的程序打印

init singleton
enter main

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

于 2013-10-18T13:44:02.883 回答