std::swappable, std::swappable_with
Определено в заголовочном файле <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> определяет, что lvalues типа 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 концепций стандартной библиотеки, должны быть сохраняющими равенство (за исключением случаев, указанных отдельно).
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/concepts/swappable