C++1z 非推奨だった古い例外仕様を削除

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キーワードによる例外仕様では、例外は送出されるかされないかのみで、なんの例外が送出される可能性があるかは扱わないため、この種のエラーは発生しません。

参照

修正履歴

  • コメント欄での指摘を受け、throw()を使用したコードがC++1zからコンパイルエラーになる記述を削除。throw()が非推奨なまま残ることを記載

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。