C++ 概念: ValueSwappable

来自cppreference.com
< cpp‎ | concept
 
 
 

此类型的二个对象能解引用,且结果值能在 std::swap 和用户定义 swap() 均可见的语境中,用非限定函数调用 swap() 交换。

[编辑] 要求

类型 T 为可值交换 (ValueSwappable) ,若

1) 类型 T 满足迭代器 (Iterator) 要求
2) 对任何 T 类型的可解引用对象 x (即异于尾迭代器的值), *x 满足可交换 (Swappable) 要求。

许多标准库函数期待其参数满足可值交换 (ValueSwappable) ,这表示凡在标准库进行交换时,它使用 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)
}