6

std::swapは次のように宣言されています。

template <class T> void swap (T& a, T& b)
    noexcept (is_nothrow_move_constructible<T>::value && 
              is_nothrow_move_assignable<T>::value);

プログラムで例外を無効にすると ( g++ の場合と同様-fno-exceptions) カスタムstd::swap型が noexcept であるかどうかに関係なく、移動が有効になっている場合、カスタム型に対して移動操作が使用されますか?

編集:フォローアップの質問:

std::swap は、私のタイプに移動がある場合は常に移動を使用することに気付いた後、私の本当の質問は、次のような特性に何が起こるis_nothrow_move_assignable<>かです ?

型に移動操作std::vectorがある場合、再割り当て時に常に移動を使用しますか?noexcept(true)

4

2 に答える 2

4

noexcept-specification onは、例外に遭遇せずに使用できる場所をユーザーswapに伝えるだけです。実装は実質的に常に次と同等ですswap

auto tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);

オーバーロードの解決で移動代入演算子および/またはコンストラクターが選択された場合にのみ、オブジェクトを移動します。

于 2015-05-16T14:43:00.257 に答える
3

はい。の move コンストラクターと move 代入がスローしない場合にスローしないnoexceptことを指定するだけです。の本体の動作にはまったく影響しません。例外を有効にしてコンパイルするかどうかに関係なく、 のムーブ コンストラクターとムーブ割り当てを使用します。std::swapTswapT

于 2015-05-16T14:42:53.083 に答える