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 типа. Для наглядности, неквалифицированная версия его типа обозначается как __weak_order_fn.
Все экземпляры __weak_order_fn равны. Действия от вызова различных экземпляров типа __weak_order_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицировано ли оно как const или нет (хотя требуется, чтобы экземпляр с квалификатором 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<=> недоступен(объект точки кастомизации) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/compare/weak_order