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";
    // OK
}
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++規格に対して遡及的に適用されました。

DR Applied to Behavior as published Correct behavior
CWG 2924 C++11 returning from a [ [ noreturn ] ] function
would result in undefined behavior
results in runtime-
undefined behavior

参考文献

  • 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 ドキュメント for [[noreturn]]