N3797の時点で、C++ 標準ではswap
、特に指定されていない限り、コンテナーの関数が例外をスローしないことを要求しています[container.requirements.general]
( 23.2.1§10 )。
swap
スローしないように指定されているメンバー関数が宣言されていないのはなぜnoexcept
ですか?
同じ質問が特殊な非メンバーswap
オーバーロードにも当てはまります。
refp の発言に加えて、Daniel Krügler のstd-discussion
メーリング リストへの投稿を次に示します。
関数を無条件の noexcept として宣言する内部ポリシーは、 で説明されています。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3279.pdf
その論文で使用されている用語では、std::vector の swap 関数には狭義の契約があります。つまり、参加するオブジェクトのアロケータに関する前提条件があります。これは、呼び出し元が前提条件に違反する可能性があることを意味し、実装は、終了とは異なる方法でこれを通知できるようにする必要があります。したがって、そのような関数は noexcept であってはなりませんが、前提条件が満たされた場合に適用されるため、有効な要素 "Throws: Nothing" を持つ必要があります。
(リンク)
上記の内部ポリシーは、あなたの質問に対する正規の公式の回答です。