std::three_way_comparable, std::three_way_comparable_with
| Определено в заголовочном файле <compare>
|
||
template<class T, class Cat = std::partial_ordering> concept three_way_comparable = __WeaklyEqualityComparableWith<T, T> && __PartiallyOrderedWith<T, T> && requires(const std::remove_reference_t<T>& a, const std::remove_reference_t<T>& b) { { a <=> b } -> __ComparesAs<Cat>; }; |
(1) | (начиная с C++20) |
template<class T, class U, class Cat = std::partial_ordering> concept three_way_comparable_with = std::three_way_comparable<T, Cat> && std::three_way_comparable<U, Cat> && __ComparisonCommonTypeWith<T, U> && std::three_way_comparable< std::common_reference_t< const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>, Cat> && __WeaklyEqualityComparableWith<T, U> && __PartiallyOrderedWith<T, U> && requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) { { t <=> u } -> __ComparesAs<Cat>; { u <=> t } -> __ComparesAs<Cat>; }; |
(2) | (начиная с C++20) |
template<class T, class Cat> concept __ComparesAs = std::same_as<std::common_comparison_category_t<T, Cat>, Cat>; |
(3) | (только для пояснения*) |
std::three_way_comparable указывает, что оператор трёхстороннего сравнения <=> над T даёт результаты, согласующиеся с категорией сравнения, подразумеваемой Cat.std::three_way_comparable_with указывает, что трёхсторонний оператор сравнения <=> над (возможно, смешанными) операндами T и U даёт результаты, соответствующие категории сравнения, подразумеваемой Cat. Сравнение смешанных операндов даёт результаты, эквивалентные сравнению операндов, преобразованных к их общему типу.__WeaklyEqualityComparableWith, __PartiallyOrderedWith и __ComparisonCommonTypeWith это концепты только для пояснения. Смотрите описания equality_comparable и totally_ordered.
Семантические требования
Эти концепты моделируются только в том случае, если они удовлетворены, и моделируются все концепты, которые они включают в себя.
T и Cat моделируются std::three_way_comparable<T, Cat> только в том случае, если для данных lvalue a и b типа const std::remove_reference_t<T> верно следующее:
(a <=> b == 0) == bool(a == b),(a <=> b != 0) == bool(a != b),((a <=> b) <=> 0)и(0 <=> (b <=> a))равны,bool(a > b) == bool(b < a),bool(a >= b) == !bool(a < b),bool(a <= b) == !bool(b < a),(a <=> b < 0) == bool(a < b),(a <=> b > 0) == bool(a > b),(a <=> b <= 0) == bool(a <= b)и(a <=> b >= 0) == bool(a >= b); и- если
Catпреобразуется в std::strong_ordering,Tмоделируетtotally_ordered.
T, U и Cat моделируют std::three_way_comparable_with<T, U, Cat> только если
tиt2, значения lvalue обозначают разные равные объекты типовconst std::remove_reference_t<T>иstd::remove_reference_t<T>соответственно иuиu2, значения lvalue обозначают различные равные объекты типовconst std::remove_reference_t<U>иstd::remove_reference_t<U>соответственно.
Пусть C будет std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&> и задано выражение E и тип C, пусть CONVERT_TO<C>(E) будет:
|
(до C++23) |
|
(начиная с C++23) |
верно следующее:
t <=> uиu <=> tимеют тот же домен;((t <=> u) <=> 0)и(0 <=> (u <=> t))равны;(t <=> u == 0) == bool(t == u),(t <=> u != 0) == bool(t != u),Cat(t <=> u) == Cat(CONVERT_TO<C>(t2) <=> CONVERT_TO<C>(u2)),(t <=> u < 0) == bool(t < u),(t <=> u > 0) == bool(t > u),(t <=> u <= 0) == bool(t <= u),(t <=> u >= 0) == bool(t >= u); и- если
Catпреобразуется в std::strong_ordering,TиUмоделируютstd::totally_ordered_with<T, U>.
Сохранение равенства
Выражения, объявленные в выражениях requires концептов стандартной библиотеки, должны сохранять равенство (если не указано иное).
Варианты неявных выражений
Выражение requires, которое использует выражение, которое не модифицирует для некоторого константного операнда lvalue, также неявно требует дополнительных вариаций этого выражения, которые принимают неконстантное lvalue или (возможно, константное) rvalue для данного операнда, если только такое изменение выражения явно требуется с различной семантикой. Эти вариации неявных выражений должны соответствовать тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариантов, не определена.
Смотрите также
указывает, что оператор == является отношением эквивалентности (концепт) | |
| указывает, что операторы сравнения для типа дают общий порядок (концепт) |