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