C++ 命名需求: ValueSwappable (自 C++11 起)
此类型的两个对象可以被解引用,并且结果值可以在 std::swap
和用户定义的 swap()
都可见的上下文中,使用无限定函数调用 swap()
进行交换。
要求
如果 T 满足以下条件,则 T 是 ValueSwappable:
- T 满足 LegacyIterator 需求
- 对于任何类型 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
}