|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Two objects of this type can be dereferenced and the resulting values can be swapped using unqualified function callswap() in the context where bothstd::swap and the user-definedswap()s are visible.
A type T isValueSwappable if
T satisfies theLegacyIterator requirements.x of typeT (that is, any value other than the end iterator),*x satisfies theSwappable requirements.Many standard library functions expect their arguments to satisfyValueSwappable, which means that any time the standard library performs a swap, it uses the equivalent ofusingstd::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 assignablevoid 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 ValueSwappablestd::iter_swap(p1, p2);// OK: iter_swap requires ValueSwappable// std::swap(v1, v2); // compiler error! std::swap requires MoveAssignable}
(C++20) | specifies that the values referenced by twoindirectly_readable types can be swapped(concept)[edit] |