三路比较运算符(C++20)
使用太空船运算符 实现简洁且一致的比较
三路比较运算符(C++20) 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
太空船运算符 <=>
C++20 引入了三向比较运算符 <=>。一个运算符就能为编译器生成全部六个关系运算符提供所需信息。
返回类型:三种类别
返回类型取决于排序强度:
std::strong_ordering— 可区分的等价值std::weak_ordering— 等价但可区分(例如不区分大小写)std::partial_ordering— 某些值无法比较(例如 NaN)
默认比较
最常见的模式是:让编译器通过按字典序比较成员来生成 <=>。
struct Point {
int x;
int y;
auto operator<=>(const Point& other) const = default;
};
Point a{1, 2}, b{1, 3};
bool less = (a < b); // true — auto-generated免费获得全部六个
将 <=> 设为默认实现也会将 == 设为默认实现。二者结合后会生成 !=、<、<=、>、>=——一行代码即可得到全部六个。
自定义 <=> 实现
请手动编写函数体,以实现自定义的比较逻辑。
std::strong_ordering operator<=>(const Person& other) const {
if (auto c = name <=> other.name; c != 0) return c;
return age <=> other.age;
}使用比较结果
<=> 的结果可以与字面量 0 比较,从而执行您实际需要的布尔检查。
if ((a <=> b) < 0) std::cout << "a less\n";
if ((a <=> b) == 0) std::cout << "equal\n";
if ((a <=> b) > 0) std::cout << "a greater\n";浮点数与 partial_ordering
对于浮点数,请使用 std::partial_ordering 来处理 NaN——与 NaN 比较会得到 unordered。
struct Measurement {
double value;
std::partial_ordering operator<=>(const Measurement&) const = default;
};弱排序示例
当值可能有所区别但比较结果相等时,请使用弱排序,例如不区分大小写的字符串。
独立自定义 ==
您可以将 <=> 设为默认实现,同时自行编写 ==——有时相等性的规则与排序规则不同。
迁移旧代码
如果您的类以前有许多比较运算符,那么迁移到 C++20 时,可以用默认的 <=> 替代它们。代码大幅减少,语义保持不变。
何时不应使用 <=>
对于只需要判断相等性而不需要排序的类型,请只提供 operator== 和 operator!=(后者会在 C++20 中自动合成)。
性能说明
编译器对默认的 <=> 进行优化后,性能可能与手写比较一样高效。使用太空船运算符不会产生运行时开销。
快速检查
对于可能包含 NaN 的浮点类型,比较应使用哪种返回类别?
回顾
C++20 的 <=> 运算符可以通过一次定义生成全部六个关系运算符。请将其设为默认实现,以按字典序比较成员。请根据类型的语义选择强排序、弱排序或部分排序。
常见问题解答
「三路比较运算符(C++20)」课时是免费的吗?
是的 — 「三路比较运算符(C++20)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「三路比较运算符(C++20)」这节课中我会学到什么?
使用太空船运算符 实现简洁且一致的比较 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「三路比较运算符(C++20)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 算术与比较运算符
- 流插入与提取运算符
- 下标与函数调用运算符
- 三路比较运算符(C++20)