名前空間
変種
操作

名前付き要件: ValueSwappable

提供: cppreference.com
< cpp‎ | named req
 
 
名前付き要件
 

この型の2つのオブジェクトは逆参照可能であり、その結果の値は std::swap とユーザ定義の swap() が可視な文脈における無修飾な関数呼び出し swap() を用いてスワップ可能です。

[編集] 要件

以下の内容を満たす場合、型 TValueSwappable を満たします。

1) TIterator の要件を満たす。
2) 任意の逆参照可能な型 T のオブジェクト x (つまり終端イテレータ以外の任意の値) について、 *xSwappable の要件を満たす。

多くの標準ライブラリ関数は ValueSwappable を満たす引数を期待します。 これは、標準ライブラリが swap を行うときは using std::swap; swap(*iter1, *iter2); と同等なコードを使用することを意味します。

[編集]

#include <iostream>
#include <vector>
 
class IntVector {
    std::vector<int> v;
    IntVector& operator=(IntVector); // not assignable
 public:
    void swap(IntVector& other) {
        v.swap(other.v);
    }
};
void swap(IntVector& v1, IntVector& v2) {
    v1.swap(v2);
}
 
int main()
{
    IntVector v1, v2;    // IntVector is Swappable, but not MoveAssignable
    IntVector* p1 = &v1;
    IntVector* p2 = &v2; // IntVector* is ValueSwappable
    std::iter_swap(p1, p2); // OK: iter_swap requires ValueSwappable
//  std::swap(v1, v2); // compiler error! std::swap requires MoveAssignable
}