在 Qt 6.7 版本中,我们领导了 C++20 比较的sup端口,并将其一些功能向后移植到 C++17。这篇博文将概述我们正在利用的比较增强功能,并提供有关在自定义类中实现这些增强功能的指导。
简而言之
C++20 引入了几项新功能和改进。值得注意的是,它以多种方式改变了比较运算符的工作方式,使您能够用更少的代码实现更多。
重要的补充是三因子比较运算符 <=>,也称为 spaceship 运算符。它执行单个比较操作并返回一个结果,指示左侧 (LHS) 是小于、等于还是大于右侧 (RHS)。
宇宙飞船运算符的三种可能的结果类型是 std::strong_ordering、std::weak_ordering 或 std::p artial_ordering,具体取决于比较类型实现的强度类别。与简单的布尔结果相比,这三个排序类别提供了更细致的方法来比较值,因为它们不仅表示(不)相等,还表示值之间的相对关系。
- 强排序可保证被视为相等的值在所有常规操作中的行为相同,这意味着值的每个方面都相同,除了它们的内存地址。
- 弱排序认为某些值是等效的,尽管它们在特定方面有所不同。假设我们有两个字符串 “Qt” 和 “qt”。如果您决定不区分大小写地比较它们,则它们被视为弱排序。为什么?因为即使 lhs[0] 和 rhs[0] 不完全相同(Q 和 q),字符串也被认为是等效的。为您提供额外信息:此类型适合排序。
- 部分排序更宽松。当某些值根本无法有意义地排序时,例如在比较浮点 NaN 时,它很有用。在这种情况下,结果可能是 partial_order::unordered。
另一个值得注意的功能是能够从已定义的关系运算符中合成缺失的关系运算符。例如,这使得 operator!=() 可用,这要归功于 operator==() 和 operator<=>() 的所有其他关系运算符。
此外,对于混合类型比较,spaceship 运算符和相等运算符中的参数顺序无关紧要,因为编译器还将合成反向运算符。
最终,这大大简化了过程,因为您不再需要为您的类型手动实现所有这些 <、<=、==、!=、>= 和 > 运算符。相反,你只需要实现 operator==() 和 operator<=>() 。