std::swappable, std::swappable_with - cppreference.com (original) (raw)
| Defined in header | ||
|---|---|---|
| template< class T > concept swappable = requires(T& a, T& b) { ranges::swap(a, b); }; | (1) | (since C++20) |
| template< class T, class U > concept swappable_with = std::common_reference_with<T, U> && requires(T&& t, U&& u) { ranges::swap(std::forward<T>(t), std::forward<T>(t)); ranges::swap(std::forward<U>(u), std::forward<U>(u)); ranges::swap(std::forward<T>(t), std::forward<U>(u)); ranges::swap(std::forward<U>(u), std::forward<T>(t)); }; | (2) | (since C++20) |
The concept swappable<T> specifies that lvalues of type T are swappable.
The concept swappable_with<T, U> specifies that expressions of the type and value category encoded by T and U are swappable with each other. swappable_with<T, U> is satisfied only if a call to ranges::swap(t, u) exchanges the value of t and u, that is, given distinct objects t2 equal to t and u2 equal to u, after evaluating either ranges::swap(t, u) or ranges::swap(u, t), t2 is equal to u and u2 is equal to t.
[edit] Equality preservation
Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
[edit] References
C++23 standard (ISO/IEC 14882:2024):
18.4.9 Concept
swappable[concept.swappable]C++20 standard (ISO/IEC 14882:2020):
18.4.9 Concept
swappable[concept.swappable]