Spec-Zone.ru › C++

std::weak_order

Определён в заголовочном файле <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. Подробности см. в разделе Объект точки настройки.

Строгий слабый порядок типов с плавающей точкой 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 с одинаковым знаком эквивалентны.

Пример

См. также

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

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

Spec-Zone.ru

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