0Pricing
C++ Academy · 课时

三路比较运算符(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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 算术与比较运算符
  2. 流插入与提取运算符
  3. 下标与函数调用运算符
  4. 三路比较运算符(C++20)
← 返回 C++ Academy