C++ 属性: noreturn (自 C++11 起)
来自 cppreference.cn
< cpp | language | attributes
指示函数不返回。
目录 |
[编辑] 语法
[[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++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
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]] |