Namespaces
Variants

std::weak_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 */ 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 <=> недоступен
(объект точки настройки)