std::three_way_comparable, std::three_way_comparable_with
Определено в заголовочном файле <compare> | ||
template<class T, class Cat =std::partial_ordering> concept three_way_comparable = | (1) | (начиная с C++20) |
template<class T, class U, class Cat =std::partial_ordering> concept three_way_comparable_with = | (2) | (начиная с C++20) |
template<class T, class Cat> concept __ComparesAs = | (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
типа conststd::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 обозначают разные равные объекты типов conststd::remove_reference_t<T> и std::remove_reference_t<T> соответственно иu
иu2
, значения lvalue обозначают различные равные объекты типов conststd::remove_reference_t<U> и std::remove_reference_t<U> соответственно.
Пусть C
будет std::common_reference_t<conststd::remove_reference_t<T>&, conststd::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 для данного операнда, если только такое изменение выражения явно требуется с различной семантикой. Эти вариации неявных выражений должны соответствовать тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариантов, не определена.
[править]Смотрите также
указывает, что оператор == является отношением эквивалентности (концепт) | |
указывает, что операторы сравнения для типа дают общий порядок (концепт) |