什么是"recursive_init_error"例外?

What's a "recursive_init_error" exception?

本文关键字:例外 error init recursive 什么      更新时间:2023-10-16

我决定用计算的goto和本地静态量做一个测试

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?谢谢你的解释

这是由c++ 03§6.7/4:

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

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

——结束例子)

GCC在这种情况下抛出异常。这里有一些关于它的文档。


c++ 11更新:在c++ 11中增加了以下措辞,就在关于递归情况的文本之前:

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

88在执行初始化式时不能引入死锁。

没有改变这里的问题,但是在没有递归的情况下使这个结构是线程安全的。

相关文章: