Пространства имён
Варианты
Действия

std::strong_order

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
strong_order
(C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Определено в заголовочном файле <compare>
inline namespace /* не указано */ {

    inline constexpr /* не указано */ strong_order = /* не указано */;

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

    requires /*смотри ниже */

constexpr std::strong_ordering strong_order( T&& t, U&& u ) noexcept(/* смотри ниже */);

Сравнивает два значения, используя трёхстороннее сравнение, и выдаёт результат типа 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)), если оно сформировано правильно.
  • Во всех остальных случаях выражение имеет неправильный формат, что может привести к ошибке подстановки, когда оно появляется в непосредственном контексте создания экземпляра шаблона.

Содержание

[править] Выражение эквивалентности

Выражение e это выражение эквивалентности для выражения f, если

Объекты точек настройки

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

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

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

Иначе, оператор вызова функции __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 являются числами NaN с одинаковым знаком и поле мантиссы x меньше поля y, то total_order_less(x, y) == !std::signbit(x).

[править] Пример

[править] Смотрите также

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