我知道这是一个经常被问到的问题,但由于有太多的变体,我想重新陈述它,并希望有一个反映当前状态的答案。类似的

Logger& g_logger() {
    static Logger lg;
    return lg;
}

变量lg的构造函数保证只运行一次吗?

我从之前的回答中知道,在c++ 03中,这不是;在c++ 0x草案中,这是强制的。但我想要一个更明确的答案

在c++ 11标准(不是草案)中,线程安全的初始化行为最终确定了吗? 如果以上是肯定的,那么在目前流行的编译器的最新版本,即gcc 4.7, vc 2011和clang 3.0中,它们是否正确地实现了?


有关第6.7节:

这样的变量在控件第一次通过其声明时进行初始化;这样的变量在初始化完成后就被认为已经初始化。[…如果在变量初始化时,控件同时进入声明,则并发执行将等待初始化完成。

然后有一个脚注:

实现不能在初始化式执行时引入任何死锁。

所以是的,你是安全的。

(当然,这并没有说明通过引用对变量的后续访问。)


——fno-threadsafe-statics也值得一提。在gcc:

不要发出额外的代码来使用c++ ABI中指定的例程来进行本地静态的线程安全初始化。您可以使用此选项在不需要线程安全的代码中略微减小代码大小。

另外,看看旧线程函数静态变量线程安全在GCC?