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が付いている場合がある。たとえば、atomic_exchange()のような、アトミックライブラリの関数などには、noexceptが付いている。
関連項目
参照元
この記事は、「標準ライブラリにおける、関数にnoexceptを付けない条件 - Faith and Brave - C++で遊ぼう」のブログエントリから転載し、修正を行っている。