Namespaces
Variants

std::strong_order

С сайта ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
Определён в заголовке <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 класса. Для подробностей см. CustomizationPointObject .

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

Пример

Смотрите также

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