最終更新日時:
が更新

履歴 編集

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

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++で遊ぼう」のブログエントリから転載し、修正を行っている。