Пространства имён
Варианты
Действия

std::three_way_comparable, std::three_way_comparable_with

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
<tbody> </tbody>
Определено в заголовочном файле <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) (только для пояснения*)
1) Концепт std::three_way_comparable указывает, что оператор трёхстороннего сравнения <=> над T даёт результаты, согласующиеся с категорией сравнения, подразумеваемой Cat.
2) Концепт std::three_way_comparable_with указывает, что трёхсторонний оператор сравнения <=> над (возможно, смешанными) операндами T и U даёт результаты, соответствующие категории сравнения, подразумеваемой Cat. Сравнение смешанных операндов даёт результаты, эквивалентные сравнению операндов, преобразованных к их общему типу.

__WeaklyEqualityComparableWith, __PartiallyOrderedWith и __ComparisonCommonTypeWith это концепты только для пояснения. Смотрите описания equality_comparable и totally_ordered.

Семантические требования

Эти концепты моделируются только в том случае, если они удовлетворены, и моделируются все концепты, которые они включают в себя.

1) 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.
2) 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) будет:

  • static_cast<C>(std::as_const(E)).
(до C++23)
  • static_cast<const C&>(std::as_const(E)), если это допустимое выражение,
  • static_cast<const C&>(std::move(E)) иначе.
(начиная с 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 для данного операнда, если только такое изменение выражения явно требуется с различной семантикой. Эти вариации неявных выражений должны соответствовать тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариантов, не определена.

Смотрите также

указывает, что оператор == является отношением эквивалентности
(концепт) [править]
указывает, что операторы сравнения для типа дают общий порядок
(концепт) [править]