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