std::swap
(on partitioned ranges)
<algorithm>
<utility>
<string_view>
Exchanges the given values.
This overload participates in overload resolution only if std::is_move_constructible_v <T> && std::is_move_assignable_v <T> is true.
(since C++17)This overload participates in overload resolution only if std::is_swappable_v <T2> is true.
(since C++17)T
must meet the requirements of CopyConstructible and CopyAssignable (until C++11)MoveConstructible and MoveAssignable (since C++11).
T2
must meet the requirements of Swappable.
(none)
(none)
(until C++11) std::is_nothrow_move_constructible <T>::value &&
std::is_nothrow_move_assignable <T>::value
swap
in the exception specification finds this function template in addition to anything found by the usual lookup rules, making the exception specification equivalent to C++17 std::is_nothrow_swappable .
(since C++11)std::swap
may be specialized in namespace std for program-defined types, but such specializations are not found by ADL (the namespace std is not the associated namespace for the program-defined type).
The expected way to make a program-defined type swappable is to provide a non-member function swap in the same namespace as the type: see Swappable for details.
The following overloads are already provided by the standard library:
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream & operator<<(std::ostream & os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // error, type requirements are not satisfied swap(p, q); // OK, ADL finds the appropriate friend `swap` std::cout << p << ' ' << q << '\n'; }
Output:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 227 | C++98 | T was not required to be CopyConstructible or DefaultConstructible (a temporary object of type T might not be able to be constructed)
|
T is also required tobe CopyConstructible |
LWG 809 | C++98 | arrays could not be swapped | added overload (2) |
LWG 2554 | C++11 | swapping multi-dimensional arrays can never be noexcept due to name lookup problems |
made to work |