那时候写 C++。
你一写自定义类型。
很快就会碰到一个问题。
它怎么比。
当年:排序这事,全靠手工
你想把对象丢进 std::map。
或者 std::sort。
你就得提供比较。
最朴素的写法。
就是从 operator< 开始。
线上啪一下:你改了字段,忘了改比较规则
你写了个小项目。
用结构体表示版本号。
struct Version {
int major;
int minor;
};
bool operator<(const Version& a, const Version& b) {
if (a.major != b.major) return a.major < b.major;
return a.minor < b.minor;
}
它能跑。
然后你加了一个字段。
比如 patch。
你忘了改比较。
线上就会出现一种很奇怪的现象。
日志里版本号看着更大。
排序结果却跑到前面。
你开始怀疑 std::sort。
最后发现是你自己漏了。
旧世界的痛点:比较运算符是一套“散落的约定”
你要的是一个“比较规则”。
你写出来的却是一堆函数。
<。
==。
有些团队还会写 >、!=。
写多了。
总有人漏。
总有人写错。
C++20:<=> 把比较规则变成一件事
你可以写一个三路比较。
#include <compare>
struct Version {
int major;
int minor;
int patch;
auto operator<=>(const Version&) const = default;
};
= default 的意思是。
按成员顺序比较。
先比 major。
再比 minor。
再比 patch。
它帮你省掉了什么
有了 <=>。
编译器可以替你生成。
<、<=、>、>=。
甚至还可以生成 ==。
你不需要手工保持它们一致。
你刚学 C++ 会皱眉:<=> 返回的到底是什么
你可以先不背类型名。
把它当成一个“比较结果”。
小于。
等于。
大于。
三种之一。
标准库给了几种常见的比较类别。
比如 std::strong_ordering。
以后你再细看也不迟。
关键结论
比较规则只写一份。
剩下的让编译器生成。
小结
<=> 不是为了炫。
它是为了减少那种。
“我明明改了字段,但忘了改比较”的事故。