Spec-Zone.ru › C++

std::compare_three_way

Определено в заголовочном файле <compare>
Определено в заголовочном файле <functional>
struct compare_three_way;
(с C++20)

Объект-функция для выполнения сравнений. Выводит типы параметров и тип возвращаемого значения оператора вызова функции.

Вложенные типы

Вложенный тип Определение
is_transparent неопределено

Члены-функции

operator()
получает результат сравнения двух аргументов
(публичный член-функция)

std::compare_three_way::operator()

template< class T, class U >
constexpr auto operator()( T&& t, U&& u ) const;

Учитывая выражение std::forward<T>(t) <=> std::forward<U>(u) как expr:

  • Если expr приводит к вызову встроенного оператора <=> для сравнения указателей, с учетом композитного типа указателя t и u как P:
  • Сравнивает два преобразованных указателя (типа P) в определяемой реализацией строгой полной упорядоченности указателей:
    • Если t предшествует u, возвращает std::strong_ordering::less.
    • Если u предшествует t, возвращает std::strong_ordering::greater.
    • В противном случае возвращает std::strong_ordering::equal.
  • Если последовательность преобразований из T в P или последовательность преобразований из U в P не является сохраняющей равенство, поведение не определено.
  • В противном случае:
    • Возвращает результат expr.
    • Если std::three_way_comparable_with<T, U> не смоделирован, поведение не определено.

Этот перегруз участвует в разрешении перегрузки только если std::three_way_comparable_with<T, U> выполняется.

Пример

#include <compare>
#include <iostream>
 
struct Rational
{
    int num;
    int den; // > 0
 
    // Although the comparison X <=> Y will work, a direct call
    // to std::compare_three_way{}(X, Y) requires the operator==
    // be defined, to satisfy the std::three_way_comparable_with.
    constexpr bool operator==(Rational const&) const = default;
};
 
constexpr std::weak_ordering operator<=>(Rational lhs, Rational rhs)
{
    return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
 
void print(std::weak_ordering value)
{
    value < 0 ? std::cout << "less\n" :
    value > 0 ? std::cout << "greater\n" :
                std::cout << "equal\n";
}
 
int main()
{
    Rational a{6, 5};
    Rational b{8, 7};
    print(a <=> b);
    print(std::compare_three_way{}(a, b));
}

Вывод:

greater
greater

Отчеты об ошибках

Следующие отчеты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Правильное поведение
LWG 3530 C++20 синтаксические проверки были ослаблены при сравнении указателей только семантические требования ослаблены

См. также

ranges::equal_to
(C++20)
объект функции, реализующий x == y
(класс)
ranges::not_equal_to
(C++20)
объект функции, реализующий x != y
(класс)
ranges::less
(C++20)
объект функции, реализующий x < y
(класс)
ranges::greater
(C++20)
объект функции, реализующий x > y
(класс)
ranges::less_equal
(C++20)
объект функции, реализующий x <= y
(класс)
ranges::greater_equal
(C++20)
объект функции, реализующий x >= y
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/compare/compare_three_way

Spec-Zone.ru

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