std::strong_order
Определено в заголовочном файле <compare> | ||
|---|---|---|
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ strong_order = /* unspecified */;
}
| (с C++20) | |
| Подпись вызова | ||
template< class T, class U >
requires /* see below */
constexpr std::strong_ordering strong_order( T&& t, U&& u ) noexcept(/* see below */);
|
Сравнивает два значения с помощью 3-стороннего сравнения и возвращает результат типа std::strong_ordering.
Пусть t и u являются выражениями, а T и U обозначают соответственно decltype((t)) и decltype((u)), std::strong_order(t, u) эквивалентно:
- Если
std::is_same_v<std::decay_t<T>, std::decay_t<U>>равноtrue:-
std::strong_ordering(strong_order(t, u)), если это корректное выражение с выполнением разрешения перегрузки в контексте, не включающем объявлениеstd::strong_order, - в противном случае, если
Tявляется типом с плавающей точкой:- если
std::numeric_limits<T>::is_iec559равноtrue, выполняет сравнение totalOrder значений с плавающей точкой по ISO/IEC/IEEE 60559 и возвращает результат в качестве значения типаstd::strong_ordering(примечание: это сравнение может различать положительный и отрицательный ноль, а также NaNs с различными представлениями), - в противном случае, возвращает значение типа
std::strong_ordering, согласованное с порядком, наблюдаемым операторами сравненияT,
- если
- в противном случае,
std::strong_ordering(std::compare_three_way()(t, u)), если оно корректное.
-
- Во всех остальных случаях выражение некорректно, что может привести к ошибке подстановки при появлении в непосредственном контексте шаблона.
Объекты точек кастомизации
Имя std::strong_order обозначает объект точки кастомизации, который является const функциональным объектом типа литерального semiregular класса. Для целей пояснения, неквалифицированная версия его типа обозначается как __strong_order_fn.
Все экземпляры __strong_order_fn равны. Эффекты вызова разных экземпляров типа __strong_order_fn с одинаковыми аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицировано ли оно как const (однако, экземпляр с квалификатором volatile не обязательно должен быть вызываемым). Таким образом, std::strong_order можно свободно копировать, а его копии можно использовать взаимозаменяемо.
Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям аргументов для std::strong_order выше, __strong_order_fn моделирует
-
std::invocable<__strong_order_fn, Args...>, -
std::invocable<const __strong_order_fn, Args...>, -
std::invocable<__strong_order_fn&, Args...>, и -
std::invocable<const __strong_order_fn&, Args...>.
В противном случае, ни один оператор вызова функции __strong_order_fn не участвует в разрешении перегрузки.
Строгий общий порядок типов IEEE с плавающей точкой
Пусть x и y — значения одного и того же типа IEEE с плавающей точкой, а total_order_less(x, y) — булево значение, указывающее, предшествует ли x значению y в строгом общем порядке, определённом totalOrder в ISO/IEC/IEEE 60559.
(total_order_less(x, y) || total_order_less(y, x)) == false тогда и только тогда, когда x и y имеют одинаковый битовый шаблон.
- если ни
x, ниyне являются NaN:- если
x < y, тоtotal_order_less(x, y) == true; - если
x > y, тоtotal_order_less(x, y) == false; - если
x == y,- если
x— отрицательный ноль, аy— положительный ноль,total_order_less(x, y) == true, - если
xне ноль, а поле экспонентыxменьше поля экспонентыy, тоtotal_order_less(x, y) == (x > 0)(имеет смысл только для десятичных чисел с плавающей точкой);
- если
- если
- если либо
x, либоyявляется NaN:- если
x— отрицательный NaN, аy— не отрицательный NaN, тоtotal_order_less(x, y) == true, - если
x— не положительный NaN, аy— положительный NaN, тоtotal_order_less(x, y) == true, - если оба
xиyявляются NaNs с одинаковым знаком, а поле мантиссыxменьше поля мантиссыy, тоtotal_order_less(x, y) == !std::signbit(x).
- если
Пример
См. также
|
(C++20) | результат 3-стороннего сравнения, поддерживающий все 6 операторов и подставляемый (класс) |
|
(C++20) | выполняет 3-стороннее сравнение и возвращает результат типа std::weak_ordering (объект точки кастомизации) |
|
(C++20) | выполняет 3-стороннее сравнение и возвращает результат типа std::partial_ordering(объект точки кастомизации) |
|
(C++20) | выполняет 3-стороннее сравнение и возвращает результат типа std::strong_ordering, даже если operator<=> недоступен(объект точки кастомизации) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/compare/strong_order