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 с одинаковым знаком эквивалентны.
Пример
См. также
|
(C++20) | тип результата трёхстороннего сравнения, поддерживающий все 6 операторов и не являющийся подставляемым (класс) |
|
(C++20) | выполняет трёхстороннее сравнение и возвращает результат типа std::strong_ordering(объект точки настройки) |
|
(C++20) | выполняет трёхстороннее сравнение и возвращает результат типа std::partial_ordering(объект точки настройки) |
|
(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