C++ 概念: Swappable

来自cppreference.com
< cpp‎ | concept
 
 
 

任何此类型的左值或右值能与一些其他类型的任何左值或右值,在 std::swap 与用户定义 swap() 均可见的语境中用非限定函数调用 swap()

目录

[编辑] 要求

类型 U 与类型 T 可交换,若对于任何 U 类型对象 u 和任何 T 类型对象 t ,

表达式 要求 语义
#include <utility>

using std::swap;
swap(u, t);

调用后, t 的值是 u 在调用前保有的值,而 u 的值是 t 在调用前保有的值。 调用名为 swap() ,在所有有该名称且被参数依赖查找找到的函数和定义于头文件 <utility> 的二个模板 std::swap 中,为重载决议所找到的函数。
#include <utility>

using std::swap;
swap(t, u);

同上 同上

许多标准库函数(例如许多算法)期待其参数满足可交换 (Swappable) ,这表示标准库进行交换的任何时候,使用 using std::swap; swap(t, u); 的等价写法。

典型的实现进行二者之一

1) 在外围命名空间定义非成员 swap ,它转发成员 swap ,若要求访问非公开数据成员
2) 于类中定义友元函数(此方法从异于 ADL 的名称查找中隐藏类限定交换)

[编辑] 注意

标准库进行交换时是否实际包含 <utility> 是未指定的,故用户提供的 swap() 不应期待它被包含。

[编辑] 示例

#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;
//  std::swap(v1, v2); // 编译器错误! std::swap 要求可移动赋值 (MoveAssignable)
    std::iter_swap(&v1, &v2); // OK :标准库调用非限定 swap()
}


[编辑] 参阅

检查一个类型的对象是否能与同类型或不同类型的对象交换
(类模板) [编辑]