C++ 属性: noreturn (C++11 以降)
From cppreference.com
< cpp | language | attributes
関数が戻らないことを示します。
目次 |
[編集] 構文
[[noreturn]]
|
|||||||||
[編集] 説明
関数が終了した後、呼び出し元の関数に制御フローを戻さないことを示します (例: アプリケーションを終了する関数、例外を投げる関数、無限ループする関数など)。この属性は、関数宣言で宣言される関数の名前にのみ適用されます。
以前に [[noreturn]] で宣言された関数が呼び出され、その呼び出しが最終的に戻る場合、動作は実行時未定義です。
いずれかの宣言がこの属性を指定する場合、関数の最初の宣言はこれを指定する必要があります。ある翻訳単位で関数が [[noreturn]] で宣言され、別の翻訳単位で同じ関数が [[noreturn]] なしで宣言された場合、プログラムは ill-formed です。診断は不要です。
[編集] 例
このコードを実行
[[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 をmixinして送出する (関数テンプレート) |
非ローカルジャンプ (C++17 以降) | |
| 指定された場所にジャンプする (関数) | |
[編集] 欠陥レポート
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 2924 | C++11 | [[noreturn]] 関数からの復帰は 未定義動作を引き起こす |
実行時未定義動作となる 未定義動作 |
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 9.12.10 Noreturn 属性 [dcl.attr.noreturn]
- C++20 standard (ISO/IEC 14882:2020)
- 9.12.9 Noreturn 属性 [dcl.attr.noreturn]
- C++17 standard (ISO/IEC 14882:2017)
- 10.6.8 Noreturn 属性 [dcl.attr.noreturn]
- C++14 standard (ISO/IEC 14882:2014)
- 7.6.3 Noreturn 属性 [dcl.attr.noreturn]
- C++11 standard (ISO/IEC 14882:2011)
- 7.6.3 Noreturn 属性 [dcl.attr.noreturn]
[編集] 関連項目
| C ドキュメント (_Noreturn)
| |
| C ドキュメント (
[[noreturn]]) |