Оператор трёхстороннего сравнения C++20
Используйте оператор космического корабля для кратких и согласованных сравнений.
«Оператор трёхстороннего сравнения 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 — локальная установка не требуется.
Все уроки этого курса
- Арифметические операторы и операторы сравнения
- Операторы вставки и извлечения потоков
- Операторы индексирования и вызова функции
- Оператор трёхстороннего сравнения C++20