C++ Academy · Урок

Оператор трёхстороннего сравнения C++20

Используйте оператор космического корабля для кратких и согласованных сравнений.

Урок 4 из 414 шагов

«Оператор трёхстороннего сравнения C++20» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Оператор космического корабля <=>

В C++20 появился оператор сравнения «три пути» <=>. Один оператор предоставляет компилятору всё необходимое для генерации всех шести операторов отношений.

Типы возврата: три категории

Тип возврата зависит от силы отношения:

  • std::strong_ordering — эквивалентные значения, которые можно различить
  • std::weak_ordering — значения эквивалентны, но различимы (например, без учёта регистра)
  • std::partial_ordering — некоторые значения несравнимы (например, NaN)

Сравнение по умолчанию

Наиболее распространённый шаблон: попросить компилятор сгенерировать <=>, сравнивая члены лексикографически.

struct Point {
    int x;
    int y;
    auto operator<=>(const Point& other) const = default;
};

Point a{1, 2}, b{1, 3};
bool less = (a < b);     // true — auto-generated

Все шесть операторов бесплатно

Задание <=> по умолчанию также задаёт ==. Вместе они порождают !=, <, <=, >, >= — все шесть операторов в одной строке.

Пользовательская реализация <=>

Напишите тело вручную, если требуется нестандартная логика сравнения.

std::strong_ordering operator<=>(const Person& other) const {
    if (auto c = name <=> other.name; c != 0) return c;
    return age <=> other.age;
}

Использование результата

Результат <=> можно сравнивать с литералом 0, чтобы выполнить нужную Вам булеву проверку.

if ((a <=> b) < 0)  std::cout << "a less\n";
if ((a <=> b) == 0) std::cout << "equal\n";
if ((a <=> b) > 0)  std::cout << "a greater\n";

Числа с плавающей точкой и partial_ordering

Для чисел с плавающей точкой используйте std::partial_ordering для обработки NaN — сравнение с NaN даёт результат unordered.

struct Measurement {
    double value;
    std::partial_ordering operator<=>(const Measurement&) const = default;
};

Пример слабого отношения

Используйте слабое отношение, когда значения могут различаться, но при сравнении считаются равными, например строки без учёта регистра.

Независимая настройка ==

Можно задать <=> по умолчанию и написать собственный == — иногда правила равенства отличаются от правил упорядочивания.

Перенос старого кода

Если раньше в Вашем классе было множество операторов сравнения, при переходе на C++20 замените их на <=> со значением по умолчанию. Кода станет намного меньше, а семантика останется прежней.

Когда не следует использовать <=>

Для типов, где важно только равенство, а порядок не имеет значения, предоставьте только operator== и operator!= (в C++20 последний синтезируется автоматически).

Замечание о производительности

Компилятор может оптимизировать заданный по умолчанию <=> так же эффективно, как написанные вручную сравнения. Использование оператора космического корабля не создаёт дополнительных затрат во время выполнения.

Быстрая проверка

Какую категорию возврата следует использовать для типов с плавающей точкой, которые могут содержать NaN?

Итоги

Оператор C++20 <=> порождает все шесть операторов отношений из одного определения. Задайте его по умолчанию, чтобы сравнивать члены лексикографически. Выбирайте сильное, слабое или частичное упорядочивание в зависимости от семантики Вашего типа.

Можно начать бесплатно

Изучай C++ с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Оператор трёхстороннего сравнения C++20» бесплатный?

Да — полный текст урока «Оператор трёхстороннего сравнения C++20» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Оператор трёхстороннего сравнения C++20»?

Используйте оператор космического корабля для кратких и согласованных сравнений. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Оператор трёхстороннего сравнения C++20»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Арифметические операторы и операторы сравнения
  2. Операторы вставки и извлечения потоков
  3. Операторы индексирования и вызова функции
  4. Оператор трёхстороннего сравнения C++20
← Назад к C++ Academy