Spec-Zone.ru › C++

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 */);

Сравнивает два значения с помощью трёхстороннего сравнения и выдаёт результат типа 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_order обозначает объект точки настройки — константный функциональный объект типа класса литерал semiregular. Подробности см. в разделе Объект точки настройки.

Строгий полный порядок типов 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).

Пример

См. также

strong_ordering
(C++20)
тип результата трёхстороннего сравнения, поддерживающий все 6 операторов и допускающий подстановку
(класс)
weak_order
(C++20)
выполняет трёхстороннее сравнение и выдаёт результат типа std::weak_ordering
(объект точки настройки)
partial_order
(C++20)
выполняет трёхстороннее сравнение и выдаёт результат типа std::partial_ordering
(объект точки настройки)
compare_strong_order_fallback
(C++20)
выполняет трёхстороннее сравнение и выдаёт результат типа std::strong_ordering, даже если operator<=> недоступно
(объект точки настройки)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/compare/strong_order

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API