我正在跟踪一些遗留代码,我在Singleton类的.cpp文件中找到了这个,
namespace
{
bool forceInit = (CFoo::getInstance(), true);
}
这段代码是什么意思?这是单例类的强制初始化吗?为什么代码存在?
由于
答案 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
......正如预期的那样。