三向比较符<=>简化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 <iostream>
#include <compare>
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"; // 输出
}
如果需要自定义比较逻辑,比如优先比较 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)中可减少错误<=> 返回类型,可写通用比较函数例如,在泛型代码中安全比较:
template <typename T>
void 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 让比较逻辑更简洁、安全、高效。合理使用默认生成和手动控制,能大幅提升代码可维护性。
以上就是c++++20怎么使用三向比较符(spaceship operator)_C++20新特性与比较操作符实战的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号