読者です 読者をやめる 読者になる 読者になる

標準ライブラリにおける、関数にnoexceptを付けない条件

C++

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++日本語リファレンス