13

N3797の時点で、C++ 標準ではswap、特に指定されていない限り、コンテナーの関数が例外をスローしないことを要求しています[container.requirements.general]( 23.2.1§10 )。

  • swapスローしないように指定されているメンバー関数が宣言されていないのはなぜnoexceptですか?

同じ質問が特殊な非メンバーswapオーバーロードにも当てはまります。

4

2 に答える 2

10

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" を持つ必要があります。

(リンク)

上記の内部ポリシーは、あなたの質問に対する正規の公式の回答です。

于 2014-05-20T09:35:42.793 に答える