C++11から、throw
キーワードを使用した関数の例外指示が非推奨になり、例外を投げないことを明示するnoexcept
キーワードが追加されました。
標準ライブラリもnoexcept
に対応しているのですが、仕様上、自然言語で「Throws: Nothing.」と書いてあって、noexcept
が付いていないものがいくつかあります。
たとえば、std::mutex
クラスのunlock()
メンバ関数には、noexcept
が付いていません。
これは、「N3279 - Conservative use of noexcept in the library」のペーパーで論じられた結果としてこうなっています。簡単に言えば、noexcept
を付けない条件は以下のようになります:
関数に事前条件が設定されている場合(unlock()
の場合は、すでにアンロックされていないこと)、事前条件の不一致を報告するために、実装が例外を投げる場合があります。そういう関数に対しては、noexcept
は付いていません。
例外があることを前提としていない、C言語の互換ライブラリには、noexcept
が付いている場合があります。たとえば、アトミックライブラリの関数などです。
追記:
このブログエントリを、cpprefjpサイトに転載しました。
標準ライブラリにおける、関数にnoexceptを付けない条件 - cpprefjp C++日本語リファレンス