我正在跟踪一些遗留代码,我在Singleton类的.cpp文件下面找到了这个,
namespace
{
bool forceInit = (CFoo::getInstance(), true);
}
Run Code Online (Sandbox Code Playgroud)
这段代码是什么意思?这是单例类的强制初始化吗?为什么代码存在?
谢谢
请考虑以下代码(注意: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;
}
Run Code Online (Sandbox Code Playgroud)
效果是:在forceInit初始化时,Singleton::Instance()调用,非constref被丢弃,并forceInit设置为true.发生这种情况的原因是因为命名空间级别变量在进入之前已静态初始化main().
问题是你做不到这么简单:
namespace
{
Singleton::Instance();
}
Run Code Online (Sandbox Code Playgroud)
人们可以这样做:
namespace
{
Singleton& singRef = Singleton::Instance();
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为作者不想将单例实际引用到翻译单元中.逗号运算符允许调用Instance()而不实际初始化对单例的静态实例的引用.
编辑:至于这样做的具体原因,如果没有评论,作者可能仍然是唯一知道他们想要的人.
编辑2:啊,BTW,上面的程序打印
init singleton
enter main
Run Code Online (Sandbox Code Playgroud)
......正如预期的那样.