什么是“recursive_init_error”异常?

时间:2011-08-06 13:39:39

标签: c++ exception initialization g++

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

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(); }

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

init terminated by recursive_init_error: exception

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

1 个答案:

答案 0 :(得分:16)

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

  

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

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

- 结束示例]

GCC在这种情况下抛出异常。这是关于它的some documentation


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

  

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

     

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

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