
在 C++20 中,三路比较运算符(Three-way comparison operator),也被称为“太空船运算符”(),是一个全新的核心语言特性,旨在简化类类型的比较操作。它通过一个运算符自动生成所有常见的比较操作(如 ==, !=, , >=),减少重复代码并提升类型安全性。
什么是三路比较?
三路比较的逻辑是:给定两个值 a 和 b,比较结果返回以下三种状态之一:
- 小于(a
- 等于(a == b)→ 返回表示“等于”的值
- 大于(a > b)→ 返回表示“大于”的值
C++20 引入了几个新的类型来表示这种结果,定义在
- std::strong_ordering:用于完全等价的类型(如整数、枚举)
- std::weak_ordering:用于可排序但不完全等价的类型(如字符串,大小写无关)
- std::partial_ordering:用于可能无法比较的类型(如浮点数 NaN)
如何使用 运算符
你可以在类中显式定义 运算符,或让编译器自动生成。
立即学习“C++免费学习笔记(深入)”;
示例1:默认生成三路比较
struct Point {int x, y;
auto operator(const Point&) const = default;
};
Point a{1, 2};
Point b{1, 3};
if (a
当使用 = default 时,编译器会逐成员进行字典序比较,并自动推导返回类型(通常是 std::strong_ordering)。
示例2:手动实现三路比较
struct Person {std::string name;
int age;
auto operator(const Person& other) const {
// 先比较 name,再比较 age
if (auto cmp = name other.name; cmp != 0)
return cmp;
return age other.age;
}
};
这里利用了 的短路逻辑:如果名字不同,直接返回比较结果;否则继续比较年龄。
与传统比较的区别和优势
在 C++20 之前,要支持所有比较操作,需要定义多达 6 个运算符:
bool operator==(const T&, const T&);bool operator!=(const T&, const T&);
bool operator bool operator bool operator>(const T&, const T&);
bool operator>=(const T&, const T&);
现在只需一个 ,其余运算符由编译器合成。这不仅减少了代码量,还避免了逻辑不一致的风险。
此外,C++20 支持“约束重载解析”,能正确处理混合类型比较。例如:
int i = 1;double d = 1.5;
if (i d
注意事项和常见陷阱
- 若只定义 ,== 可被合成,但若想优化性能,建议单独定义 operator==
- = default 要求所有成员都支持比较
- 浮点类型使用 std::partial_ordering,因为 NaN 不满足全序
- 避免在不需要的地方强制使用 ,普通类型用传统方式更清晰
基本上就这些。三路比较不是取代所有比较逻辑,而是为“自然排序”提供更简洁、安全的实现方式。合理使用能让代码更现代、更少出错。










