std::swappable, std::swappable_with
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <concepts>
|
||
template< class T > concept swappable = requires(T& a, T& b) { ranges::swap(a, b); }; |
(1) | (начиная с 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) | (начиная с C++20) |
Концепт swappable<T> указывает, что значения lvalue типа T могут быть обменяны.
Концепт swappable_with<T, U> определяет, что выражения типа и категории значений, закодированные T и U можно обменять друг с другом. swappable_with<T, U> выполняется, только если вызов ranges::swap(t, u) обменивает значения t и u, то есть при заданных различных объектах t2 равно t и u2 равно u, после оценки либо ranges::swap(t, u) либо ranges::swap(u, t), t2 равно u и u2 равно t.
Сохранение равенства
Выражения, объявленные в выражениях requires концептов стандартной библиотеки, должны сохранять равенство (если не указано иное).