Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 ifstd::is_move_constructible_v<T>&&std::is_move_assignable_v<T> istrue. | (since C++17) |
This overload participates in overload resolution only ifstd::is_swappable_v<T2> istrue. | (since C++17) |
Contents |
a, b | - | the values to be swapped |
Type requirements | ||
-T must meet the requirements ofCopyConstructible andCopyAssignable(until C++11)MoveConstructible andMoveAssignable(since C++11). | ||
-T2 must meet the requirements ofSwappable. |
(none)
(none) | (until C++11) |
noexcept specification: noexcept( std::is_nothrow_move_constructible<T>::value&& | (since C++11) |
noexcept specification: The lookup for the identifiernoexcept(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++17std::is_nothrow_swappable. | (since C++11) (until C++17) |
noexcept specification: noexcept(std::is_nothrow_swappable_v<T2>) | (since C++17) |
| (until C++20) |
The expected way to make aprogram-defined type swappable is to provide a non-member function swap in the same namespace as the type: seeSwappable for details.
The following overloads are already provided by the standard library:
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
specializes thestd::swap algorithm (function template)[edit] | |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
(C++11) | specializes thestd::swap algorithm (function)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++14) | specializes thestd::swap algorithm (function template)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
(C++17) | specializes thestd::swap algorithm (function template)[edit] |
(C++17) | specializes thestd::swap algorithm (function)[edit] |
(C++17) | specializes thestd::swap algorithm (function template)[edit] |
specializes thestd::swap algorithm (function template)[edit] | |
(C++17) | specializes thestd::swap algorithm (function)[edit] |
(C++23) | specializes thestd::swap algorithm (function)[edit] |
(C++20) | specializes thestd::swap algorithm (function)[edit] |
specializes thestd::swap algorithm (function)[edit] | |
(C++20) | specializes thestd::swap algorithm (function)[edit] |
(C++20) | specializes thestd::swap algorithm (function)[edit] |
#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, Aconst& a){return os<<"A::id="<< a.id;} public: A(int i): id{i}{} A(Aconst&)= delete; A& operator=(Aconst&)= 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 33 5A::id=6 A::id=9swap(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 beCopyConstructible orDefaultConstructible(a temporary object of type T might not be able to be constructed) | T is also required tobeCopyConstructible |
LWG 809 | C++98 | arrays could not be swapped | added overload(2) |
LWG 2554 | C++11 | swapping multi-dimensional arrays can never benoexcept due to name lookup problems | made to work |
(C++20) | swaps the values of two objects (customization point object)[edit] |
swaps the elements pointed to by two iterators (function template)[edit] | |
swaps two ranges of elements (function template)[edit] | |
(C++14) | replaces the argument with a new value and returns its previous value (function template)[edit] |