Difference between revisions of "cpp/algorithm/swap"
From cppreference.com
m (Text replace - "par req concept" to "par req named") |
(P0551R3, LWG2139) |
||
Line 42: | Line 42: | ||
===Exceptions=== | ===Exceptions=== | ||
− | @1@ {{ | + | @1@ {{rrev multi|until1=c++11 |
− | + | |rev1=(none) | |
− | + | |rev2= | |
{{noexcept| | {{noexcept| | ||
std::is_nothrow_move_constructible<T>::value && | std::is_nothrow_move_constructible<T>::value && | ||
std::is_nothrow_move_assignable<T>::value | std::is_nothrow_move_assignable<T>::value | ||
}} | }} | ||
− | + | }} | |
− | @2@ {{ | + | @2@ {{rrev multi|until1=c++17|rev1= |
− | + | {{noexcept|noexcept(swap(*a, *b))}} <!-- LWG 2554 -->The lookup for the identifier {{tt|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 {{lc|std::is_nothrow_swappable}}. | |
− | + | |rev2={{noexcept|std::is_nothrow_swappable_v<T2>}} | |
− | + | }} | |
===Complexity=== | ===Complexity=== | ||
Line 61: | Line 61: | ||
===Specializations=== | ===Specializations=== | ||
− | + | {{rrev|until=c++20| | |
− | {{ | + | {{tt|std::swap}} may be [[cpp/language/extending_std|specialized in namespace std]] for program-defined types, but such specializations are not found by [[cpp/language/adl|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 {{named req|Swappable}} for details. | ||
The following overloads are already provided by the standard library: | The following overloads are already provided by the standard library: | ||
Line 147: | Line 149: | ||
{{dsc end}} | {{dsc end}} | ||
− | + | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Revision as of 23:54, 25 June 2018
(until C++11) (since C++11) |
||
(1) | ||
template< class T > void swap( T& a, T& b ); |
(until C++11) | |
template< class T > void swap( T& a, T& b ) noexcept(/* see below */); |
(since C++11) (until C++20) |
|
template< class T > constexpr void swap( T& a, T& b ) noexcept(/* see below */); |
(since C++20) | |
(2) | ||
template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N]) noexcept(/* see below */); |
(since C++11) (until C++20) |
|
template< class T2, std::size_t N > constexpr void swap( T2 (&a)[N], T2 (&b)[N]) noexcept(/* see below */); |
(since C++20) | |
Exchanges the given values.
1) Swaps the values
a
and b
. This overload does not participate in overload resolution unless std::is_move_constructible_v<T> && std::is_move_assignable_v<T> is true.(since C++17)2) Swaps the arrays
a
and b
. In effect calls std::swap_ranges(a, a+N, b). This overload does not participate in overload resolution unless std::is_swappable_v<T2> is true.(since C++17)Contents |
Parameters
a, b | - | the values to be swapped |
Type requirements | ||
-T must meet the requirements of MoveAssignable and MoveConstructible.
| ||
-T2 must meet the requirements of Swappable.
|
Return value
(none)
Exceptions
1)
(none) |
(until C++11) |
noexcept specification:
noexcept( std::is_nothrow_move_constructible<T>::value && |
(since C++11) |
2)
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.
|
(until C++17) |
noexcept specification:
noexcept(std::is_nothrow_swappable_v<T2>) |
(since C++17) |
Complexity
1) Constant
2) Linear in N
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) | |
(C++11) |
specializes the std::swap algorithm (function template) |
specializes the std::swap algorithm (function template) | |
({{{1}}}) |
specializes the std::swap algorithm (function) |
(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++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) |
(C++17) |
specializes the std::swap algorithm (function) |
Example
Run this code
Output:
5 3 3 5
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 2554 | C++11 | swapping multi-dimensional arrays can never be noexcept due to name lookup problems
|
made to work |
See also
swaps the elements pointed to by two iterators (function template) | |
swaps two ranges of elements (function template) |