Spec-Zone.ru › C++

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 с одинаковым знаком эквивалентны.

Пример

См. также

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

Spec-Zone.ru

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