名前付き要件: ValueSwappable
提供: cppreference.com
この型の2つのオブジェクトは逆参照可能であり、その結果の値は std::swap とユーザ定義の swap() が可視な文脈における非修飾の関数呼び出し swap() を用いてスワップ可能です。
要件
以下の内容を満たす場合、型 T は ValueSwappable を満たします。
多くの標準ライブラリ関数は ValueSwappable を満たす引数を期待します。 これは、標準ライブラリが swap を行うときは using std::swap; swap(*iter1, *iter2); と同等なコードを使用することを意味します。
例
Run this code
#include <iostream>
#include <vector>
class IntVector {
std::vector<int> v;
IntVector& operator=(IntVector); // 代入可能でない
public:
void swap(IntVector& other) {
v.swap(other.v);
}
};
void swap(IntVector& v1, IntVector& v2) {
v1.swap(v2);
}
int main()
{
IntVector v1, v2; // IntVector は Swappable ですが MoveAssignable ではありません。
IntVector* p1 = &v1;
IntVector* p2 = &v2; // IntVector* は ValueSwappable です。
std::iter_swap(p1, p2); // OK、 iter_swap は ValueSwappable を要求します。
// std::swap(v1, v2); // コンパイルエラー、 std::swap は MoveAssignable を要求します。
}