Namespaces
Variants

std:: weak_order

From cppreference.net
Utilities library
Определено в заголовке <compare>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ weak_order = /* unspecified */ ;

}
(начиная с C++20)
Сигнатура вызова
template < class T, class U >

requires /* see below */

constexpr std:: weak_ordering weak_order ( T && t, U && u ) noexcept ( /* see below */ ) ;

Сравнивает два значения с помощью трёхстороннего сравнения и возвращает результат типа std::weak_ordering .

Пусть t и u будут выражениями, а T и U обозначают decltype ( ( t ) ) и decltype ( ( u ) ) соответственно. std :: weak_order ( t, u ) является эквивалентным по выражению следующему:

  • Если std:: is_same_v < std:: decay_t < T > , std:: decay_t < U >> равно true :
    • std:: weak_ordering ( weak_order ( t, u ) ) , если это корректное выражение с разрешением перегрузки в контексте, не включающем объявление std::weak_order ,
    • иначе, если T является типом с плавающей точкой:
      • если std:: numeric_limits < T > :: is_iec559 равно true , выполняет слабое упорядочивание значений с плавающей точкой (см. ниже) и возвращает этот результат как значение типа std::weak_ordering ,
      • иначе, дает значение типа std::weak_ordering , согласованное с упорядочиванием, наблюдаемым через операторы сравнения T ,
    • иначе, std:: weak_ordering ( std:: compare_three_way ( ) ( t, u ) ) , если это корректное выражение,
    • иначе, std:: weak_ordering ( std:: strong_order ( t, u ) ) , если это корректное выражение.
  • Во всех остальных случаях выражение является некорректным, что может приводить к неудаче подстановки , когда оно появляется в непосредственном контексте инстанцирования шаблона.

Содержание

Объекты точек кастомизации

Имя std::weak_order обозначает объект точки кастомизации , который является константным функциональным объектом литерального типа semiregular класса. Для подробностей см. CustomizationPointObject .

Строгий слабый порядок IEEE типов с плавающей точкой

Пусть x и y будут значениями одного типа с плавающей точкой IEEE, а weak_order_less ( x, y ) будет логическим результатом, указывающим, предшествует ли x y в строгом слабом порядке, определённом стандартом C++.

  • Если ни x , ни y не являются NaN, тогда weak_order_less ( x, y ) == true тогда и только тогда, когда x < y , т.е. все представления равных значений с плавающей точкой эквивалентны;
  • Если x является отрицательным NaN и y не является отрицательным NaN, тогда weak_order_less ( x, y ) == true ;
  • Если x не является положительным NaN и y является положительным NaN, тогда weak_order_less ( x, y ) == true ;
  • Если и x , и y являются NaN с одинаковым знаком, тогда ( weak_order_less ( x, y ) || weak_order_less ( y, x ) ) == false , т.е. все NaN с одинаковым знаком эквивалентны.

Пример

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

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