什么是"recursive_init_error"例外?
What's a "recursive_init_error" exception?
我决定用计算的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在执行初始化式时不能引入死锁。
没有改变这里的问题,但是在没有递归的情况下使这个结构是线程安全的。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 将 ctypes 与 tesserac-ocr 一起使用的例外 TessPageIteratorBoundingBox.
- 从不同目录执行时"symbol lookup error:",否则从构建目录执行时按预期工作
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 继承 C++11 中的例外?
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 为什么我会"error: expected expression"?