什么是"recursive_init_error"异常?

Joh*_*itb 8 c++ initialization g++ exception

我决定用计算得到的和局部静力学进行测试

void g() { std::cout << "init "; } 
void f() { 
  int z = 0; 
  y: z++; 
  static int x = 
    (g(), z == 1 ? ({ goto *&&y; 0; }) : 0); 
}

int main() { f(); std::cout << "!"; f(); }
Run Code Online (Sandbox Code Playgroud)

我想看看输出是否是"init init!".但令我惊讶的是,我没有得到那个输出,而是GCC优雅地处理它,在运行时输出:

init terminated by recursive_init_error: exception
Run Code Online (Sandbox Code Playgroud)

那个例外是什么?这是标准的例外吗?C++ 03还是C++ 0x?谢谢你的任何解释.

Mat*_*Mat 16

这是由C++03§6.7/ 4中所述的内容引起的:

...否则在第一次控制通过其声明时初始化这样的对象; 这样的对象在初始化完成时被认为是初始化的.如果通过抛出异常退出初始化,则初始化未完成,因此下次控制进入声明时将再次尝试初始化.如果控件在初始化对象时重新输入声明(递归),则行为未定义.[例:

int foo(int i)
{
  static int s = foo(2*i);    // recursive call – undefined
  return i+1;
}
Run Code Online (Sandbox Code Playgroud)

- 末端示例]

在这种情况下,GCC会抛出异常.这是关于它的一些文档.


C++ 11更新:在关于递归案例的文本之前,在C++ 11中添加了以下措辞:

如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.88

88实现不得在执行初始化程序时引入任何死锁.

这里没有改变问题,但是当没有递归时确实使这个构造成为线程安全的.