operator是C++20引入的三向比较运算符,返回std::strong_ordering等类型,可自动生成==、!=、=(仅当声明为=default且成员可比较时);手动定义时不自动产生==,需显式声明operator===default或满足隐式生成条件。

什么是 operator?它不是重载“等于”,而是三向比较
三向比较运算符 operator(太空船运算符)是 C++20 引入的,它的返回值不是 bool,而是一个 std::strong_ordering、std::weak_ordering 或 std::partial_ordering 类型的对象,表示“小于”“等于”“大于”三种关系的统一结果。它不替代 ==,但能自动生成 ==、!=、、、>、>=(前提是启用了比较默认化)。
如何正确声明和定义 operator?注意返回类型与默认化规则
必须显式指定返回类型,且不能省略函数体(除非用 = default)。编译器只对 = default 的情况自动合成所有比较运算符;手动定义时,仅提供 operator 不会自动产生 == —— 除非你额外声明 operator== 为 = default,或启用 C++20 的“一致比较”隐式生成规则(要求类满足特定条件)。
struct Point {
int x, y;
// ✅ 正确:显式返回 std::strong_ordering,支持所有六种比较
auto operator<=>(const Point& other) const = default;
// ❌ 错误:返回 int 或 bool 将导致编译失败
// int operator<=>(const Point&) const { ... }
// ✅ 若需自定义逻辑,应返回 ordering 类型
// auto operator<=>(const Point& other) const {
// if (auto cmp = x <=> other.x; cmp != 0) return cmp;
// return y <=> other.y;
// }
};
为什么 operator = default 有时不生成 ==?关键看成员是否可比较
即使写了 operator = default,C++20 也**不会自动合成 operator==**,除非你同时声明 bool operator==(const T&) const = default,或者你的类所有非静态数据成员本身都支持默认 == 且你未显式定义任何比较运算符(此时编译器会尝试隐式合成)。常见陷阱:
- 类中含
std::vector<:unique_ptr>>:其元素不可默认比较 →operator== = default失败 - 手动定义了
operator:会抑制所有默认比较生成(包括==和) - 基类未提供可比较接口:派生类
= default可能因基类成员不可比而编译失败
性能与兼容性:什么时候不该用 = default?
= default 本质是按成员顺序逐个调用 并短路组合,适合 POD 或结构清晰的数据。但若存在昂贵比较(如字符串深层内容比对)、或需要语义优化(如忽略浮点 NaN 差异、按业务规则排序),就必须手写逻辑。另外,旧代码依赖 operator 实现排序时,直接替换为 可能改变行为——因为 a 在有 时会被重写为 (a b) ,而 原本可能跳过部分字段。
立即学习“C++免费学习笔记(深入)”;
跨标准兼容要注意:C++17 及更早不识别 ,使用前必须确认工具链支持 C++20 且开启 -std=c++20(GCC/Clang)或 /std:c++20(MSVC)。










