Namespaces
Variants

C++ named requirements: ValueSwappable (since C++11)

From cppreference.net
C++ named requirements

两个此类型的对象可以被解引用,并且在 std::swap 与用户自定义的 swap ( ) 均可见的上下文中,可以通过非限定函数调用 swap ( ) 来交换其结果值。

要求

类型 T 满足 可值交换 要求,当

  1. 类型 T 满足 LegacyIterator 要求。
  2. 对于类型 T 的任何可解引用对象 x (即除末尾迭代器外的任何值), *x 满足 Swappable 要求。

许多标准库函数期望其参数满足 可交换值 要求,这意味着当标准库执行交换操作时,实际采用的是等效于 using std:: swap ; swap ( * iter1, * iter2 ) ; 的写法。

示例

#include <iostream>
#include <vector>
class IntVector
{
    std::vector<int> v;
//  IntVector& operator=(IntVector); // 不可赋值(C++98方式)
public:
    IntVector& operator=(IntVector) = delete; // 不可赋值
    void swap(IntVector& other)
    {
        v.swap(other.v);
    }
};
void swap(IntVector& v1, IntVector& v2)
{
    v1.swap(v2);
}
int main()
{
    IntVector v1, v2;    // IntVector 可交换但不可移动赋值
    IntVector* p1 = &v1;
    IntVector* p2 = &v2; // IntVector* 满足值可交换要求
    std::iter_swap(p1, p2); // 正常:iter_swap 要求值可交换
//  std::swap(v1, v2); // 编译错误!std::swap 要求可移动赋值
}

另请参阅

指定两个 indirectly_readable 类型所引用的值可被交换
(概念)