std::swap
Defined in header <algorithm> | (until C++11) | |
Defined in header <utility> | (since C++11) | |
Defined in header <string_view> | ||
template<class T > void swap( T& a, T& b ); | (1) | (conditionally noexcept since C++11) (constexpr since C++20) |
template<class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N]); | (2) | (conditionally noexcept since C++11) (constexpr since C++20) |
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) |
Contents |
[edit]Parameters
a, b | - | the values to be swapped |
Type requirements | ||
-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. |
[edit]Return value
(none)
[edit]Exceptions
(none) | (until C++11) |
noexcept specification: noexcept( std::is_nothrow_move_constructible<T>::value&& | (since C++11) |
noexcept specification: The lookup for the identifier noexcept(noexcept(swap(*a, *b))) 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) (until C++17) |
noexcept specification: noexcept(std::is_nothrow_swappable_v<T2>) | (since C++17) |
[edit]Complexity
[edit]Specializations
| (until C++20) |
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:
(C++11) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
specializes the std::swap algorithm (function template) | |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++11) | specializes the std::swap algorithm (function) |
(C++11) | specializes the std::swap algorithm (function template) |
(C++14) | specializes the std::swap algorithm (function template) |
(C++11) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++17) | specializes the std::swap algorithm (function template) |
(C++17) | specializes the std::swap algorithm (function) |
(C++17) | specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
(C++17) | specializes the std::swap algorithm (function) |
(C++23) | specializes the std::swap algorithm (function) |
(C++20) | specializes the std::swap algorithm (function) |
specializes the std::swap algorithm (function) | |
(C++20) | specializes the std::swap algorithm (function) |
(C++20) | specializes the std::swap algorithm (function) |
[edit]Example
#include <algorithm>#include <iostream> namespace Ns {class A {int id {}; friendvoid swap(A& lhs, A& rhs){std::cout<<"swap("<< lhs <<", "<< rhs <<")\n"; std::swap(lhs.id, rhs.id);} friendstd::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
[edit]Defect reports
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 |
[edit]See also
(C++20) | swaps the values of two objects (customization point object) |
swaps the elements pointed to by two iterators (function template) | |
swaps two ranges of elements (function template) | |
(C++14) | replaces the argument with a new value and returns its previous value (function template) |