C++ 属性: noreturn (C++11 起)
来自 cppreference.cn
表示函数不会返回。
目录 |
[编辑] 语法
[[noreturn]]
|
|||||||||
[编辑] 解释
表示函数完成后不会将控制流返回给调用函数(例如,终止应用程序、抛出异常、无限循环等的函数)。此属性仅适用于函数声明中声明的函数名称。
如果调用了先前使用 [[noreturn]] 声明的函数,并且该调用最终返回,则行为是运行时未定义的。
如果任何声明指定此属性,则函数的第一个声明必须指定此属性。如果一个函数在一个翻译单元中声明为 [[noreturn]],而在另一个翻译单元中声明为不带 [[noreturn]],则程序格式错误;不需要诊断。
[编辑] 示例
运行此代码
[[noreturn]] void f() { throw "error"; // OK } void q [[noreturn]] (int i) { // behavior is undefined if called with an argument <= 0 if (i > 0) throw "positive"; } // void h() [[noreturn]]; // error: attribute applied to function type of h, not h itself int main() { try { f(); } catch(...) {} try { q(42); } catch(...) {} }
[编辑] 标准库
以下标准函数声明了 noreturn
属性
终止函数 | |
(C++11) |
导致程序正常终止而不进行清理 (函数) |
导致程序异常终止(不进行清理) (函数) | |
导致程序正常终止并进行清理 (函数) | |
(C++11) |
导致程序快速终止而不完全清理 (函数) |
异常处理失败时调用的函数 (函数) | |
(C++11 中已废弃)(C++17 中已移除) |
动态异常规范被违反时调用的函数 (函数) |
编译器提示 | |
(C++23) |
标记不可达的执行点 (函数) |
总是抛出异常的函数 | |
(C++11) |
从 std::exception_ptr 抛出异常 (函数) |
抛出存储的异常 ( std::nested_exception 的公共成员函数)
| |
(C++11) |
抛出其参数并混入 std::nested_exception (函数模板) |
非局部跳转 (C++17 起) | |
跳转到指定位置 (函数) |
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
CWG 2924 | C++11 | 从 [[noreturn]] 函数返回 将导致未定义行为 |
导致运行时- 未定义行为 |
[编辑] 参考资料
- C++23 标准 (ISO/IEC 14882:2024)
- 9.12.10 Noreturn 属性 [dcl.attr.noreturn]
- C++20 标准 (ISO/IEC 14882:2020)
- 9.12.9 Noreturn 属性 [dcl.attr.noreturn]
- C++17 标准 (ISO/IEC 14882:2017)
- 10.6.8 Noreturn 属性 [dcl.attr.noreturn]
- C++14 标准 (ISO/IEC 14882:2014)
- 7.6.3 Noreturn 属性 [dcl.attr.noreturn]
- C++11 标准 (ISO/IEC 14882:2011)
- 7.6.3 Noreturn 属性 [dcl.attr.noreturn]
[编辑] 另请参阅
C 文档 关于 _Noreturn
| |
C 文档 关于
[[noreturn]] |