Namespaces
Variants

C++ attribute: noreturn (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

指示该函数不会返回。

目录

语法

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