Daily bit(e) C++. Операторы сравнения по умолчанию
Добавлено 12 августа 2026 в 01:46
Daily bit(e) C++ 67, операторы сравнения по умолчанию для проверки на равенство и для упорядочивания в C++20.

В C++20 были введены операторы сравнения по умолчанию.
Оператор сравнения «космический корабль» по умолчанию реализует пошаговое сравнение, сравнивая базовые элементы и члены по порядку. Результатом является сильное, слабое или частичное сравнение (на основе самого слабого подрезультата).
Дефолтный оператор сравнения «космический корабль» по умолчанию неявно устанавливает оператор равенства, если тот не объявлен.
Оператор равенства также может быть установлен по умолчанию отдельно, реализуя пошаговое сравнение и выдавая логический результат.
#include <compare>
#include <string>
struct Custom
{
int v;
// Дефолтный operator== также обеспечивает operator!=
friend bool operator==(const Custom&, const Custom&) = default;
// То же самое, что и: bool operator==(const Custom&) const = default;
};
Custom a{4}, b{5};
// a != b
struct Point
{
int x;
int y;
// Дефолтное трехстороннее сравнение также устанавливает дефолтный
// operator==, если тот не объявлен:
friend auto operator<=>(const Point&, const Point&) = default;
// То же самое, что и: auto operator <=>(const Point&) const = default;
};
Point c{1,2}, d{1,3};
// c < d, std::is_lt(c <=> d) == true
struct Base
{
int id;
auto operator<=>(const Base&) const = default;
};
struct Derived : Base
{
std::string data;
// Дефолтный оператор "космический корабль":
auto operator<=> (const Derived&) const = default;
/* Ручная реализация с той же семантикой:
auto operator<=>(const Derived& other) const
{
auto cmp = (const Base&)*this <=> (const Base&)other;
if (std::is_neq(cmp)) // id != other.id
return cmp;
return this->data <=> other.data;
}
// Нам также потребуется вернуть operator==
auto operator==(const Derived&) == default;
*/
};
Derived e{2,"hello"}, f{2,"bye"};
// e > f, std::is_gt(e <=> f) == true
