Any lvalue or rvalue of this type can be swapped with any lvalue or rvalue of some other type, using unqualified function call swap()
in the context where both std::swap
and the user-defined swap()
s are visible.
Type U is swappable with type T if, for any object u of type U and any object t of type T,
Expression | Requirements | Semantics |
---|---|---|
#include <utility> | After the call, the value of t is the value held by u before the call, and the value of u is the value held by t before the call. | Calls the function named swap() found by overload resolution among all functions with that name that are found by argument-dependent lookup and the two std::swap templates defined in the header <utility> . |
#include <utility> | same | same |
Many standard library functions (for example, many algorithms) expect their arguments to satisfy Swappable
, which means that any time the standard library performs a swap, it uses the equivalent of using std::swap; swap(t, u);
.
Typical implementations either.
It is unspecified whether <utility>
is actually included when the standard library functions perform the swap, so the user-provided swap()
should not expect it to be included.
#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; // std::swap(v1, v2); // compiler error! std::swap requires MoveAssignable std::iter_swap(&v1, &v2); // OK: library calls unqualified swap() }
(C++17)(C++17)(C++17)(C++17) | checks if objects of a type can be swapped with objects of same or different type (class template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/concept/Swappable