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

std::three_way_comparable, std::three_way_comparable_with

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
three_way_comparablethree_way_comparable_with
(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)
 
Определено в заголовочном файле <compare>
template<class T, class Cat =std::partial_ordering>

concept three_way_comparable =
  __WeaklyEqualityComparableWith<T, T>&&
  __PartiallyOrderedWith<T, T>&&
  requires(conststd::remove_reference_t<T>& a,
           conststd::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<
      conststd::remove_reference_t<T>&,
      conststd::remove_reference_t<U>&>, Cat>&&
  __WeaklyEqualityComparableWith<T, U>&&
  __PartiallyOrderedWith<T, U>&&
  requires(conststd::remove_reference_t<T>& t,
           conststd::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 типа 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.
2)T, U и Cat моделируют std::three_way_comparable_with<T, U, Cat> только если

Пусть C будет std::common_reference_t<conststd::remove_reference_t<T>&, conststd::remove_reference_t<U>&> и задано выражение E и тип C, пусть CONVERT_TO<C>(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 для данного операнда, если только такое изменение выражения явно требуется с различной семантикой. Эти вариации неявных выражений должны соответствовать тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариантов, не определена.

[править]Смотрите также

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