最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

# 標準ライブラリにおける、関数に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`が付いている。

## 関連項目

- C++11 noexcept

## 参照元

この記事は、「標準ライブラリにおける、関数にnoexceptを付けない条件 - Faith and Brave - C++で遊ぼう」のブログエントリから転載し、修正を行っている。