C++20三向比较运算符详解

三向比较运算符可以用于确定两个值的大小顺序,也被称为太空飞船操作符。使用单个表达式,它可以告诉一个值是否等于,小于或大于另一个值。

它返回的是类枚举(enumeration-like)类型,定义在 <compare>std 名称空间中。其运算的结果如下:

数据类型 含义
如果操作数为整数类型,其结果称为 强排序(strong_ordering) strong_ordering::less 左边的操作数小于右边的操作数
strong_ordering::greater 左边的操作数大于右边的操作数
strong_ordering::equal 左边的操作数等于右边的操作数
如果操作数为浮点类型,其结果称为 偏序(partial_ordering) partial_ordering::less 左边的操作数小于右边的操作数
partial_ordering::greater 左边的操作数大于右边的操作数
partial_ordering::equivalent 左边的操作数等于右边的操作数
partial_ordering::unordered 无法比较时(有一个非数字)
如果操作数为自己实现的类型,称为 弱排序(weak_ordering) weak_ordering::less 左边的操作数小于右边的操作数
weak_ordering::greater 左边的操作数大于右边的操作数
weak_ordering::equivalent 左边的操作数等于右边的操作数

三向比较运算符的用法

三向比较运算符的使用方式如下:

cpp 复制代码
#include <iostream>

using namespace std;

int main() {
    int i{ 11 };
    strong_ordering result{ i <=> 0 };
    cout << typeid(result).name() << endl;

    if (result == strong_ordering::less) { cout << "less" << endl; };
    if (result == strong_ordering::greater) { cout << "greater" << endl; };
    if (result == strong_ordering::equal) { cout << "equal" << endl; };

    return 0;
}

可以得到以下的输出结果

复制代码
struct std::strong_ordering
greater

同时,<compare> 还提供了一些函数来解释排序结果,有以下几种:std::is_eq()is_neq()is_lt()is_lteq()is_gt()is_gteq()

使用的方式如下:

cpp 复制代码
#include <iostream>
#include <compare>
using namespace std;

int main() {
    int i{ 11 };
    strong_ordering result{ i <=> 0 };
    cout << typeid(result).name() << endl;

    if (is_lt(result)) { cout << "less" << endl; };
    if (is_gt(result)) { cout << "greater" << endl; };
    if (is_eq(result)) { cout << "equal" << endl; };

    return 0;
}

三向比较运算符的作用

在编写自己的类时,如果需要实现比较运算符,在 C++20 之前,通常要重载 6 个比较运算符:(><<=>===, !=)。在 C++20 引入了三向比较运算符以后,就可以只重载 <=>== 后,其他的运算符会由编译器为我们生成。(在 C++20 中,重载了 == 后,!= 也会自动重载)

以下是使用示例:

cpp 复制代码
#include <iostream>
#include <compare>
using namespace std;

class MyClass {
public:
    MyClass(int ini) : _data{ ini } {}

    auto operator<=>(const MyClass& other) const {
        return this->_data <=> other._data;
    }
    auto operator==(const MyClass& other) const {
        return this->_data == other._data;
    }
private:
    int _data;
};

int main() {
    MyClass a{ 10 }, b{ 20 };

    if (a < b) {
        cout << "a < b" << endl;
    }
    if (a != b) {
        cout << "a != b" << endl;
    }

    return 0;
}

可以得到以下的运算结果:

复制代码
a < b
a != b
相关推荐
曼巴UE5几秒前
UE GamePlayTag
c++·ue5·ue
慕容青峰21 分钟前
【加拿大计算机竞赛 CCO 小行星采矿】题解
c++·算法·sublime text
Ghost-Silver26 分钟前
2025年度总结
开发语言·数据结构·c++·算法
yyy(十一月限定版)39 分钟前
C++基础
java·开发语言·c++
Ralph_Y1 小时前
C++数据库操作
开发语言·数据库·c++
酬勤-人间道1 小时前
CAD 曲线切割 3D 曲面:坡面 / 开挖模型的开挖 - 填埋精准计算解决方案
c++·计算机·cad·布尔计算·曲线切割·工业级解决方案·岩体
不会写代码的里奇2 小时前
从零开发基于DeepSeek的端侧离线大模型语音助手:全流程指南
c++·后端·音视频
nike0good2 小时前
Goodbye 2025 题解
开发语言·c++·算法
Sheep Shaun2 小时前
STL中的unordered_map和unordered_set:哈希表的快速通道
开发语言·数据结构·c++·散列表
樊梓慕2 小时前
【嵌入式】buildroot构建ros2环境
c++·机器人