std::weak_order
| Определено в заголовочном файле <compare>
|
||
inline namespace /* не указано */ { inline constexpr /* не указано */ weak_order = /* не указано */; } |
(начиная с C++20) | |
| Сигнатура вызова |
||
template< class T, class U > requires /* смотрите ниже */ constexpr std::weak_ordering weak_order(T&& t, U&& u) noexcept(/* смотрите ниже */); |
||
Сравнивает два значения, используя трёхстороннее сравнение, и выдаёт результат типа 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)), если оно правильно сформировано.
- Во всех остальных случаях выражение имеет неправильный формат, что может привести к ошибке подстановки, когда оно появляется в непосредственном контексте создания экземпляра шаблона.
Выражение эквивалентности
Выражение e это выражение эквивалентности для выражения f, если
eиfимеют одинаковые эффекты, и- либо оба являются константными подвыражениями, либо ни одно из них не является константным подвыражением, и
- либо оба являются потенциально генерирующими исключение либо ни одно из них не является потенциально генерирующим исключение (т.е.
noexcept(e) == noexcept(f)).
Объекты точек настройки
Имя std::weak_order обозначает объект точки настройки, который является константным функциональным объектом литерального классового типа semiregular. В целях наглядности версия этого типа без cv-квалификации обозначается как __weak_order_fn.
Все экземпляры __weak_order_fn равны. Эффекты от вызова разных экземпляров типа __weak_order_fn для одних и тех же аргументов эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и является ли оно константным или нет (однако volatile-квалифицированный экземпляр не требуется для вызова). Таким образом, std::weak_order можно свободно копировать, а его копии можно использовать взаимозаменяемо.
Учитывая набор типов Args..., если std::declval<Args>()... соответствует требованиям к аргументам для std::weak_order выше, __weak_order_fn модели
std::invocable<__weak_order_fn, Args...>,std::invocable<const __weak_order_fn, Args...>,std::invocable<__weak_order_fn&, Args...>иstd::invocable<const __weak_order_fn&, Args...>.
Иначе, оператор вызова функции __weak_order_fn не участвует в разрешении перегрузки.
Примечание
Строгий слабый порядок типов с плавающей запятой 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 с одинаковым знаком эквивалентны.
Пример
| Этот раздел не завершён Причина: нет примера |
Смотрите также
(C++20) |
тип результата трёхстороннего сравнения, который поддерживает все 6 операторов и невзаимозаменяемый (класс) |
(C++20) |
выполняет трёхстороннее сравнение и возвращает результат типа std::strong_ordering (объект точки настройки) |
(C++20) |
выполняет трёхстороннее сравнение и возвращает результат типа std::partial_ordering (объект точки настройки) |
(C++20) |
выполняет трёхстороннее сравнение и возвращает результат типа std::weak_ordering, даже если operator<=> недоступен (объект точки настройки) |