命名空间
变体
操作

C++ 属性: noreturn (自 C++11 起)

来自 cppreference.cn
< cpp‎ | language‎ | attributes
 
 
C++ 语言
常规主题
流程控制
条件执行语句
if
迭代语句 (循环)
for
range-for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (C++11 前已弃用*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储持续期说明符
初始化
 
 
属性
(C++23)
(C++11)(C++26 前)
(C++14)
(C++20)
(C++17)
noreturn
(C++11)
(C++20)
 

指示函数不返回。

目录

[编辑] 语法

[[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++17 中已移除)
当动态异常规范被违反时调用的函数
(函数) [编辑]
编译器提示
标记不可达的执行点
(函数) [编辑]
总是抛出异常的函数
std::exception_ptr 抛出异常
(函数) [编辑]
抛出存储的异常
(std::nested_exception 的公共成员函数)
抛出其参数,并混入 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]]