Концепции C++: ValueSwappable
Материал из cppreference.com
Два объекта этого типа можно разыменовать, а полученные значения обменять местами вызовом swap() без шаблонных параметров из контекста, где видны как стандартная std::swap, так и пользовательская swap().
Требования
Тип Т является ValueSwappable, если
2) Для любого разыменовываемого объекта
x типа T (так, нельзя разыменовывать NULL или конечный итератор) *x отвечает требованиям Swappable.Многие функции стандартной библиотеки ожидают, что их аргументы отвечают ValueSwappable. Другими словами, каждый раз, когда стандартная библиотека делает обмен, она использует эквивалент using std::swap; swap(*iter1, *iter2):.
Пример
Запустить этот код
#include <iostream>
#include <vector>
class IntVector {
std::vector<int> v;
IntVector& operator=(IntVector); // not assignable
public:
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
}