三向比较符简化C++20中类型的比较操作,通过返回std::strong_ordering或std::partial_ordering自动生成==、!=、=,支持默认和手动实现,提升代码简洁性与可维护性。

在C++20中,三向比较符(spaceship operator),即 ,是一个重要的新特性,它简化了类型的比较操作。通过一个操作符,编译器可以自动生成 ==、!=、、、> 和 >= 的逻辑,极大减少了样板代码。
什么是三向比较符
三向比较符返回一个比较类别类型,表示两个值之间的关系:
-
std::strong_ordering::less—— 左边小于右边 -
std::strong_ordering::equal—— 两边相等 -
std::strong_ordering::greater—— 左边大于右边
对于浮点数等场景,使用 std::partial_ordering,因为浮点存在 NaN,无法保证全序。
基本用法:为自定义类型启用
假设我们有一个表示二维点的结构体,想支持完整的比较功能:
立即学习“C++免费学习笔记(深入)”;
#include#include struct Point { int x, y; // 自动生成所有六种比较操作 auto operator<=>(const Point&) const = default; };
使用 = default 让编译器自动生成三向比较逻辑。字段按声明顺序逐个比较。
int main() {
Point a{1, 2};
Point b{1, 3};
if (a < b) std::cout << "a < b\n"; // 输出
if (a != b) std::cout << "a != b\n"; // 输出
if (!(a == b)) std::cout << "a not equal b\n"; // 输出
}
手动实现 spaceship operator
如果需要自定义比较逻辑,比如优先比较 y 坐标:
auto operator<=>(const Point& other) const {
if (auto cmp = y <=> other.y; cmp != 0)
return cmp;
return x <=> other.x;
}
这段代码先比较 y,如果不等直接返回结果;否则继续比较 x。利用了三向比较的结果可以直接判断是否为 0(即相等)。
与旧标准兼容和生成特定操作符
C++20 允许只定义 operator,编译器会自动合成 == 和其他关系操作符。但如果你只想支持部分比较,也可以显式删除或禁用:
bool operator==(const Point&) const = default; // 可单独控制
注意:虽然 能生成 ==,但显式写出 == 并设为 =default 通常性能更好,因为能避免逐字段三向比较,转而使用更高效的相等性判断。
实际应用场景建议
- 用于值类型(如坐标、时间、金额)时特别有用
- 在容器排序(如
std::set、std::map)中可减少错误 - 配合
返回类型,可写通用比较函数
例如,在泛型代码中安全比较:
templatevoid compare_and_print(const T& a, const T& b) { auto result = a <=> b; if (result < 0) std::cout << "a < b\n"; else if (result == 0) std::cout << "a == b\n"; else std::cout << "a > b\n"; }
基本上就这些。C++20 的 spaceship operator 让比较逻辑更简洁、安全、高效。合理使用默认生成和手动控制,能大幅提升代码可维护性。











