Swappable
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.
Requirements
Section titled “Requirements”Type U is swappable with type T if, for any object u of type U and any object t of type T,
Given
-
u, an expression of typeT. -
u, an lvalue expression of typeKey.
| Expression | Requirements | Semantics |
|---|---|---|
| After the call, the value of | Calls the function named <algorithm> <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
- Define a non-member swap in the enclosing namespace, which may forward to a member swap if access to non-public data members is required.
- Define a friend function in-class (this approach hides the class-specific swap from name lookup other than ADL).
Notes It is unspecified whether
<algorithm> <utility> Example
Section titled “Example”#include <iostream>#include <vector>
struct IntVector{ std::vector<int> v;
IntVector& operator=(IntVector) = delete; // not assignable
void swap(IntVector& other) { v.swap(other.v); }
void operator()(auto rem, auto term = " ") { std::cout << rem << "{{"; for (int n{}; int e : v) std::cout << (n++ ? ", " : "") << e; std::cout << "}}" << term; }};
void swap(IntVector& v1, IntVector& v2){ v1.swap(v2);}
int main(){ IntVector v1{{1, 1, 1, 1}}, v2{{2222, 2222}};
auto prn = [&]{ v1("v1", ", "), v2("v2", ";\n"); };
// std::swap(v1, v2); // Compiler error! std::swap requires MoveAssignable prn(); std::iter_swap(&v1, &v2); // OK: library calls unqualified swap() prn(); std::ranges::swap(v1, v2); // OK: library calls unqualified swap() prn();}Output:
v1{{1, 1, 1, 1}}, v2{{2222, 2222}};v1{{2222, 2222}}, v2{{1, 1, 1, 1}};v1{{1, 1, 1, 1}}, v2{{2222, 2222}};Defect reports
Section titled “Defect reports”The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
LWG 226 (C++98)
| Link | https://cplusplus.github.io/LWG/issues/226.html |
|---|---|
| Applied to | C++98 |
| Behavior as published | it was unclear how the standard library uses swap |
| Correct behavior | clarified to use both |
See also
Section titled “See also”std::is_swappable_with std::is_swappable std::is_nothrow_swappable_with std::is_nothrow_swappable checks if objects of a type can be swapped with objects of same or different type
swappable swappable_with specifies that a type can be swapped or that two types can be swapped with each other