名前空間
変種
操作

名前付き要件: ValueSwappable

提供: cppreference.com
< cpp‎ | named req
 
 
名前付き要件
基本
レイアウト
ライブラリ全体
(C++11)
ValueSwappable
(C++11)
(C++11)
コンテナ
コンテナの要素
イテレータ
ストリーム入出力
乱数
並行処理
(C++11)

(C++11)
(C++11)
その他
 

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

[編集] 要件

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

1) TLegacyIterator の要件を満たす。
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); // 代入可能でない
 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 を要求します。
}