std::Swappable, std::SwappableWith
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 = |
(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:
- the two std::swap function templates defined in <utility>; and
- any candidates found by argument-dependent lookup.
These concepts are satisfied only if the call to swap
actually exchanges the values of its operands. Formally, given
-
a1
,a2
,b1
andb2
, distinct objects of typeT
such thata1
is equal toa2
andb1
is equal tob2
,
-
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
andt2
, distinct equal objects of type std::remove_cvref_t<T>, -
u1
andu2
, distinct equal objects of type std::remove_cvref_t<U>, -
e_t
, an expression denotingt1
such that decltype((e_t)) isT
, -
e_u
, an expression denotingu1
such that decltype((e_u)) isU
, -
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).
[edit] Notes
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.