Namespaces
Variants

std:: strong_order

From cppreference.net
Utilities library
Определено в заголовке <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 <=> недоступен
(объект точки настройки)