我决定用计算得到的和局部静力学进行测试
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?谢谢你的任何解释。
答案 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 实现不得在执行初始化程序时引入任何死锁。
这里没有改变问题,但是当没有递归时确实使这个构造成为线程安全的。