Пространства имён
Варианты
Действия

Концепции C++: ValueSwappable

Материал из cppreference.com
< cpp‎ | concept

Два объекта этого типа можно разыменовать, а полученные значения обменять местами вызовом swap() без шаблонных параметров из контекста, где видны как стандартная std::swap, так и пользовательская swap().

[править] Требования

Тип Т является ValueSwappable, если

1) Тип T отвечает требованиям Iterator.
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
}