C++ attribute: noreturn (since C++11)
指示该函数不会返回。
目录 |
语法
[
[
noreturn
]
]
|
|||||||||
说明
表明函数在完成后不会将控制流返回给调用函数(例如终止应用程序、抛出异常、无限循环等的函数)。此属性仅适用于函数声明中所声明函数的名称。
如果先前声明为 [ [ noreturn ] ] 的函数被调用,且该调用最终返回,则行为是 运行时未定义 的。
若函数的任意声明指定了此属性,则其首次声明必须指定该属性。如果同一函数在一个翻译单元中声明为 [ [ noreturn ] ] ,而在另一个翻译单元中声明时未使用 [ [ noreturn ] ] ,则程序非良构;不要求诊断。
示例
[[noreturn]] void f() { throw "error"; // 正常 } void q [[noreturn]] (int i) { // 如果使用参数 <= 0 调用,行为未定义 if (i > 0) throw "positive"; } // void h() [[noreturn]]; // 错误:属性应用于函数类型 h,而非 h 本身 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]]
|