我知道这是一个经常被问到的问题,但由于有很多变体,我想重新陈述它,并希望有一个反映当前状态的答案。就像是
Logger& g_logger() { static Logger lg; return lg; }
变量 lg 的构造函数是否保证只运行一次?
我从以前的答案中知道,在 C03 中,这不是;在 C0x 草案中,这是强制执行的。但我想要一个更清晰的答案
相关第 6.7 节:
这样的变量在控制第一次通过其声明时被初始化;这样的变量在其初始化完成时被认为已初始化。[…]如果在初始化变量时控制同时进入声明,则并发执行应等待初始化完成。
然后是一个脚注:
实现不得在初始化程序的执行周围引入任何死锁。
所以,是的,你很安全。
(这当然没有说明通过引用对变量的后续访问。)