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实现不得在执行初始化程序时引入任何死锁.
这里没有改变问题,但是当没有递归时确实使这个构造成为线程安全的.
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |