std::strong_order
Определено в заголовочном файле <compare>
|
||
inline namespace /* не указано */ { inline constexpr /* не указано */ strong_order = /* не указано */; |
(начиная с C++20) | |
Сигнатура вызова |
||
template< class T, class U > requires /*смотри ниже */ |
||
Сравнивает два значения, используя трёхстороннее сравнение, и выдаёт результат типа 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 (примечание: это сравнение может различать положительный и отрицательный нуль и NaN с разными представлениями),
- иначе возвращает значение типа std::strong_ordering, которое согласуется с порядком, наблюдаемым операторами сравнения
T
,
- иначе, std::strong_ordering(std::compare_three_way()(t, u)), если оно сформировано правильно.
- std::strong_ordering(strong_order(t, u)), если это правильно сформированное выражение с разрешением перегрузки, выполненном в контексте, который не включает объявление
- Во всех остальных случаях выражение имеет неправильный формат, что может привести к ошибке подстановки, когда оно появляется в непосредственном контексте создания экземпляра шаблона.
Содержание |
[править] Выражение эквивалентности
Выражение e это выражение эквивалентности для выражения f, если
- e и f имеют одинаковые эффекты, и
- либо оба являются константными подвыражениями, либо ни одно из них не является константным подвыражением, и
- либо оба являются потенциально генерирующими исключение либо ни одно из них не является потенциально генерирующим исключение (т.е. noexcept(e) == noexcept(f)).
Объекты точек настройки
Имя std::strong_order
обозначает объект точки настройки, который является константным функциональным объектом литерального классового типа semiregular
. В целях наглядности версия этого типа без cv-квалификации обозначается как __strong_order_fn
.
Все экземпляры __strong_order_fn
равны. Эффекты от вызова разных экземпляров типа __strong_order_fn
для одних и тех же аргументов эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и является ли оно константным или нет (однако 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 являются числами NaN с одинаковым знаком и поле мантиссы x меньше поля y, то total_order_less(x, y) == !std::signbit(x).
[править] Пример
Этот раздел не завершён Причина: нет примера |
[править] Смотрите также
(C++20) |
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и может быть взаимозаменяемым (класс) |
(C++20) |
выполняет трёхстороннее сравнение и возвращает результат типа std::weak_ordering (объект точки настройки) |
(C++20) |
выполняет трёхстороннее сравнение и возвращает результат типа std::partial_ordering (объект точки настройки) |
выполняет трёхстороннее сравнение и возвращает результат типа std::strong_ordering , даже если operator<=> недоступен (объект точки настройки) |