Spec-Zone.ru › C++

std::strong_order

Определено в заголовочном файле <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 */);

Сравнивает два значения с помощью 3-стороннего сравнения и возвращает результат типа 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 (примечание: это сравнение может различать положительный и отрицательный ноль, а также NaNs с различными представлениями),
      • в противном случае, возвращает значение типа std::strong_ordering, согласованное с порядком, наблюдаемым операторами сравнения T,
    • в противном случае, std::strong_ordering(std::compare_three_way()(t, u)) , если оно корректное.
  • Во всех остальных случаях выражение некорректно, что может привести к ошибке подстановки при появлении в непосредственном контексте шаблона.

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

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

Все экземпляры __strong_order_fn равны. Эффекты вызова разных экземпляров типа __strong_order_fn с одинаковыми аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицировано ли оно как const (однако, экземпляр с квалификатором volatile не обязательно должен быть вызываемым). Таким образом, std::strong_order можно свободно копировать, а его копии можно использовать взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям аргументов для std::strong_order выше, __strong_order_fn моделирует

  • std::invocable<__strong_order_fn, Args...>,
  • std::invocable<const __strong_order_fn, Args...>,
  • std::invocable<__strong_order_fn&, Args...>, и
  • std::invocable<const __strong_order_fn&, Args...>.

В противном случае, ни один оператор вызова функции __strong_order_fn не участвует в разрешении перегрузки.

Строгий общий порядок типов 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 являются NaNs с одинаковым знаком, а поле мантиссы x меньше поля мантиссы y, то total_order_less(x, y) == !std::signbit(x).

Пример

См. также

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

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

Spec-Zone.ru

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