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) |
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
.
|
Return value
(none)
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) |
Complexity
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) |
|
(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) |
(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) |
|
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) |
(C++11)
|
specializes the
std::swap
algorithm
(function template) |
(C++11)
|
specializes the
std::swap
algorithm
(function template) |
(C++20)
|
specializes the
std::swap
algorithm
(function template) |
(C++23)
|
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) |
(C++11)
|
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) |
(C++11)
|
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) |
(C++23)
|
specializes the
std::swap
algorithm
(function) |
(C++20)
|
specializes the
std::swap
algorithm
(function) |
(C++20)
|
specializes the
std::swap
algorithm
(function) |
Example
#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
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 to
be 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 |
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) |