贝利信息

c++20的三路比较运算符()有什么用? (简化对象比较)

日期:2026-01-20 00:00 / 作者:冰火之心
三路比较运算符operator是C++20引入的“太空船运算符”,用一个函数定义全部比较关系;可default生成或手动返回std::strong_ordering等,但显式定义opera

tor==会阻止==的隐式合成。

)有什么用? (简化对象比较)">

三路比较运算符 operator 是什么

它是 C++20 引入的“太空船运算符”,用一个函数同时定义 ==> 等全部比较关系,避免手写六个比较运算符的重复劳动。

怎么写一个基本的 operator

最常见写法是返回 std::strong_ordering(或 std::weak_orderingstd::partial_ordering),编译器会自动合成其余比较操作符(前提是没显式定义它们)。

struct Point {
    int x, y;
    auto operator<=>(const Point& other) const = default; // 编译器自动生成
};

也可以手动实现:

struct Version {
    int major, minor, patch;
    auto operator<=>(const Version& v) const {
        if (auto cmp = major <=> v.major; cmp != 0) return cmp;
        if (auto cmp = minor <=> v.minor; cmp != 0) return cmp;
        return patch <=> v.patch;
    }
};

为什么不能随便混用 ==

如果类里显式定义了 operator==,即使写了 operator,编译器也不会自动生成 == —— 它会优先用你写的 ==,而 仍只负责大小关系。

容易被忽略的兼容性细节

operator 不会自动让类支持 std::sortstd::map —— 这些容器仍依赖 operator,而它默认由 合成;但如果你禁用了合成(比如显式删掉 operator),就会编译失败。

真正省事的前提是:所有成员类型本身支持三路比较,且你不插手任何一个比较运算符的显式定义 —— 多一动,就得多一分验证。