C++ 面试题
目录

C++20 中 <=> 运算符 (三路比较运算符) 的用法?

· 约 3 分钟读完 · 第 144 / 181 章

推荐答案

在C++20中,<=> 运算符(三路比较运算符)用于比较两个对象,并返回一个比较结果对象。这个结果对象可以是 std::strong_ordering、std::weak_ordering 或 std::partial_ordering 类型的值,具体取决于比较的类型。

示例代码

输出

本题详细解读

1. <=> 运算符的作用

<=> 运算符是C++20引入的三路比较运算符,它用于比较两个对象并返回一个比较结果对象。这个结果对象可以是以下三种类型之一:

  • std::strong_ordering:表示强序关系,通常用于可完全排序的类型(如整数、浮点数等)。
  • std::weak_ordering:表示弱序关系,通常用于部分可排序的类型(如字符串等)。
  • std::partial_ordering:表示偏序关系,通常用于不可完全排序的类型(如浮点数中的NaN)。

2. 使用 <=> 运算符

<=> 运算符可以用于自定义类型的比较操作。通过重载 <=> 运算符,可以简化比较操作的实现。C++20 还引入了 default 关键字,允许编译器自动生成 <=> 运算符的实现。

3. 示例代码解析

在示例代码中,Point 结构体定义了一个 <=> 运算符,并使用 default 关键字让编译器自动生成比较逻辑。main 函数中,p1 和 p2 两个 Point 对象通过 <=> 运算符进行比较,并根据比较结果输出相应的信息。

4. 比较结果的使用

<=> 运算符返回的比较结果可以直接与 0 进行比较,以判断两个对象的大小关系:

  • 如果 (a <=> b) < 0,则 a 小于 b。
  • 如果 (a <=> b) == 0,则 a 等于 b。
  • 如果 (a <=> b) > 0,则 a 大于 b。

5. 注意事项

  • <=> 运算符的返回值类型取决于比较的类型,因此在不同的上下文中可能需要显式指定返回类型。
  • 使用 default 关键字时,编译器会自动生成 <=> 运算符的实现,但前提是所有成员都支持 <=> 运算符。

通过 <=> 运算符,C++20 提供了一种简洁且强大的方式来实现对象的比较操作。