Defined in header <concepts> | ||
|---|---|---|
template< class T > concept Swappable = std::is_swappable_v<T>; | (1) | (since C++20) |
template< class T, class U >
concept SwappableWith =
std::is_swappable_with_v<T, T> &&
std::is_swappable_with_v<U, U> &&
std::CommonReference<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&> &&
std::is_swappable_with_v<T, U> &&
std::is_swappable_with_v<U, T>;
| (2) | (since C++20) |
The concept Swappable<T> specifies that lvalues of type T are swappable. The concept SwappableWith<T, U> specifies that expressions of the type and value category encoded by T and U are swappable with each other.
In each case, overload resolution for the call to swap is performed on a candidate set that includes:
std::swap function templates defined in <utility>; and These concepts are satisfied only if the call to swap actually exchanges the values of its operands. Formally, given.
a1, a2, b1 and b2, distinct objects of type T such that a1 is equal to a2 and b1 is equal to b2, Swappable<T> is satisfied only if, after evaluating either swap(a1, b1) or swap(b1, a1), a1 is equal to b2 and b1 is equal to a2.
And given.
t1 and t2, distinct equal objects of type std::remove_cvref_t<T>, u1 and u2, distinct equal objects of type std::remove_cvref_t<U>, e_t, an expression denoting t1 such that decltype((e_t)) is T, e_u, an expression denoting u1 such that decltype((e_u)) is U, C, the common reference type of const std::remove_reference_t<T>& and const std::remove_reference_t<U>&, SwappableWith<T, U> is satisfied only if, after evaluating either swap(e_t, e_u) or swap(e_u, e_t), C(t1) is equal to C(u2) and C(u1) is equal to C(t2).
These definitions of Swappable and SwappableWith are expected to be temporary, and will be replaced if the full Ranges proposal is adopted for C++20.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/concepts/Swappable