std::totally_ordered, std::totally_ordered_with
Определено в заголовке <concepts> | ||
|---|---|---|
template< class T >
concept totally_ordered =
std::equality_comparable<T> && __PartiallyOrderedWith<T, T>;
| (1) | (с C++20) |
template< class T, class U >
concept totally_ordered_with =
std::totally_ordered<T> &&
std::totally_ordered<U> &&
std::equality_comparable_with<T, U> &&
std::totally_ordered<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__PartiallyOrderedWith<T, U>;
| (2) | (с C++20) |
template< class T, class U >
concept __PartiallyOrderedWith =
requires(const std::remove_reference_t<T>& t,
const std::remove_reference_t<U>& u) {
{ t < u } -> boolean-testable;
{ t > u } -> boolean-testable;
{ t <= u } -> boolean-testable;
{ t >= u } -> boolean-testable;
{ u < t } -> boolean-testable;
{ u > t } -> boolean-testable;
{ u <= t } -> boolean-testable;
{ u >= t } -> boolean-testable;
};
| (3) | (только для иллюстрации*) |
std::totally_ordered задаёт требования к операторам сравнения ==,!=,<,>,<=,>= типа, которые должны соответствовать строгому полному порядку на типе.std::totally_ordered_with задаёт требования к операторам сравнения ==,!=,<,>,<=,>= над (возможно смешанными) операндами T и U, которые должны соответствовать строгому полному порядку. Сравнение смешанных операндов даёт результат, эквивалентный результату сравнения операндов, преобразованных к общему типу.__PartiallyOrderedWith (только для иллюстрации) задаёт требования к сравнению значений типа T и типа U в частичном порядке друг с другом (в любом порядке) с использованием <, >, <=, и >=, а также требует согласованности результатов сравнений.Семантические требования
Эти концепции моделируются только в том случае, если они удовлетворяются и все подчинённые им концепции также моделируются.
1)std::totally_ordered<T> моделируется только если, учитывая lvalues a, b и c типа const std::remove_reference_t<T>: - ровно один из
bool(a < b),bool(a > b)иbool(a == b)являетсяtrue; - если
bool(a < b)иbool(b < c)оба являютсяtrue, тоbool(a < c)являетсяtrue; -
bool(a > b) == bool(b < a) -
bool(a >= b) == !bool(a < b) -
bool(a <= b) == !bool(b < a)
std::totally_ordered_with<T, U> моделируется только если, учитывая -
tиt2, lvalues, обозначающие различные равные объекты типовconst std::remove_reference_t<T>иstd::remove_reference_t<T>соответственно, и -
uиu2, lvalues, обозначающие различные равные объекты типов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) |
следующее верно:
-
bool(t < u) == bool(CONVERT_TO<C>(t2) < CONVERT_TO<C>(u2)) -
bool(t > u) == bool(CONVERT_TO<C>(t2) > CONVERT_TO<C>(u2)) -
bool(t <= u) == bool(CONVERT_TO<C>(t2) <= CONVERT_TO<C>(u2)) -
bool(t >= u) == bool(CONVERT_TO<C>(t2) >= CONVERT_TO<C>(u2)) -
bool(u < t) == bool(CONVERT_TO<C>(u2) < CONVERT_TO<C>(t2)) -
bool(u > t) == bool(CONVERT_TO<C>(u2) > CONVERT_TO<C>(t2)) -
bool(u <= t) == bool(CONVERT_TO<C>(u2) <= CONVERT_TO<C>(t2)) -
bool(u >= t) == bool(CONVERT_TO<C>(u2) >= CONVERT_TO<C>(t2))
__PartiallyOrderedWith<T, U> моделируется только если, учитывая - любой lvalue
tтипаconst std::remove_reference_t<T>, и - любой lvalue
uтипаconst std::remove_reference_t<U>,
следующее верно:
-
t < u,t <= u,t > u,t >= u,u < t,u <= t,u > t, иu >= tимеют одинаковую область определения; -
bool(t < u) == bool(u > t); -
bool(u < t) == bool(t > u); -
bool(t <= u) == bool(u >= t); и -
bool(u <= t) == bool(t >= u).
Сохранение равенства
Выражения, объявленные в выражениях requires концепций стандартной библиотеки, должны быть сохраняющими равенство (кроме случаев, когда указано иначе).
Неявные вариации выражений
Выражение requires, использующее выражение, не изменяющее некоторые константные операнды lvalue, также требует неявных вариаций выражений.
См. также
|
(C++20) | определяет, что оператор <=> даёт согласованный результат для заданных типов (концепция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/concepts/totally_ordered