【发布时间】:2014-11-27 09:34:28
【问题描述】:
我正在使用的一些代码使用 std::call_once 以便某些初始化只发生一次。但是,有些全局对象的构造函数最终会调用初始化代码。
在下面的示例中, call_once 实际上被调用了两次。我猜这是因为 once_flag 构造函数在使用之前还没有运行。有没有办法让一些初始化代码只被调用一次而不必禁止全局变量?
#include <mutex>
#include <iostream>
using namespace std;
void Init();
class Global
{
public:
Global()
{
Init();
}
};
Global global;
once_flag flag;
void Init()
{
call_once(flag, []{ cout << "hello" << endl; });
}
int main(int argc, char* argv[])
{
Init();
return 0;
}
输出是:
hello
hello
【问题讨论】:
-
对于 GCC 和 Clang,我只看到一次“hello”输出。
-
@remyabel - 嗯,我想知道这是否是 micosoft STL 错误。
-
您的
using namespace std;破坏了 C++ 的命名空间机制。它还使您的代码更难理解。不要那样做。而是using std::once_flag;等。即导入特定符号;不要转储命名空间。此外,对于标准 C++ 样式,请避免将函数名大写。
标签: c++ c++11 visual-studio-2013