Namespaces
Variants

std::unexpected

ja.cppreference.net より
 
 
 
ヘッダで定義 <exception>
void unexpected();
(C++11 まで)
[[noreturn]] void unexpected();
(C++11 から)
(C++17 まで)
(C++11 で非推奨)

std::unexpected() は、動的例外仕様に違反した場合にC++ランタイムによって呼び出されます。つまり、例外仕様がこの型の例外を禁止している関数から例外がスローされた場合です。

std::unexpected() はプログラムから直接呼び出されることもあります。

どちらの場合も、std::unexpected は現在インストールされている std::unexpected_handler を呼び出します。デフォルトの std::unexpected_handler は std::terminate を呼び出します。

デストラクタがスタック巻き戻し中にunexpectedハンドラをリセットし、その後巻き戻しが unexpected の呼び出しに至った場合、throw式の終了時にインストールされていたハンドラが呼び出されます(再スローが新しいハンドラを適用するかどうかは曖昧でした)。

(C++11 まで)

デストラクタがスタック巻き戻し中にunexpectedハンドラをリセットした場合、その後巻き戻しが unexpected の呼び出しに至ったときにどのハンドラが呼び出されるかは未規定です。

(C++11 から)

例外

現在インストールされている std::unexpected_handler によってスローされる例外をスローします。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2111 C++11 スタックアンワインディング中に std::set_unexpected を呼び出した場合の効果が
C++98と異なり、一部のABIを破壊する
未規定とする

関連項目

(C++23)
予期しない値として表現される
(クラステンプレート)
(C++11で非推奨) (C++17で削除)
std::unexpected によって呼び出される関数の型
(typedef)