C++11でnoexcept
が導入されたことによって非推奨になっていたthrow
キーワードによる関数の例外仕様が、C++1zで削除されます。
throw
キーワードによる例外仕様とは、void f() throw(std::runtime_error)
のように、その関数がどの種類の例外を送出する可能性があるかを列挙する機能です。Javaの検査例外に近いものです。これはジェネリックプログラミングと相性が悪いことで問題視されていました。
C++1z以降、throw
キーワードを使用した例外仕様のコードはコンパイルが通らなくなりますのでご注意ください。throw()
はnoexcept
と等価な効果を持つ機能として、非推奨のまま残ります。例外送出のthrow
は変わりません。
// C++11から非推奨だがC++14まで合法。C++1zからコンパイルエラー //void f() throw(std::runtime_error); // C++11からは、noexceptを付けないことにより // 「なんらかの例外が送出される可能性がある」ことを表現するか、 void f(); // コンパイル時の条件式によって、なんらかの例外が送出される可能性の有無を指定する void f() noexcept(cond);
throw
キーワードによる例外仕様の削除にともない、関連して非推奨だった以下の機能が削除されます:
これらの機能は、例外仕様で指定されていない例外が送出された場合に発生するエラーを検知するためのものですが、noexcept
キーワードによる例外仕様では、例外は送出されるかされないかのみで、なんの例外が送出される可能性があるかは扱わないため、この種のエラーは発生しません。
参照
修正履歴
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。