命名空间
变体
操作

C++ 命名需求: ValueSwappable (自 C++11 起)

来自 cppreference.com
 
 
C++ 命名需求
 

此类型两个对象的解引用结果可以使用非限定函数调用 swap() 在同时存在 std::swap 和用户定义的 swap() 的上下文中进行交换。

[编辑] 需求

类型 T 如果满足以下条件则为 ValueSwappable

  1. T 满足 LegacyIterator 需求。
  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); // not assignable (C++98 way)
public:
    IntVector& operator=(IntVector) = delete; // not assignable
    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
}

[编辑] 另请参阅

指定两个 indirectly_readable 类型引用的值可以交换
(概念) [编辑]