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).
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.