为何默认operator<=>自动生成operator==,自定义实现却不行?
C++20中默认与手动实现operator<=>导致operator==行为差异的原因
问题描述
尝试两种方式定义operator<=>:
- 变体A使用
= default默认实现,此时可正常使用operator==; - 变体B手动实现
operator<=>后,x1 == x2的比较操作失效。
为何会出现这种差异?这是C++20标准中的规定吗?
示例代码
#include <iostream> class X { public: int y; /*A*/ inline std::strong_ordering operator<=>(const X& another) const = default; /*B*/ //inline std::strong_ordering operator<=>(const X& another) const { return y <=> another.y; } }; int main() { using std::cout; using std::endl; X x1; x1.y = 5; X x2; x2.y = 7; cout << "x1 == x2: " << (x1 == x2) << endl; cout << "x1 == x2: " << (x1 <=> x2 == 0) << endl; return 0; }
原因解析
这是C++20标准的明确规定,核心差异在于编译器是否自动生成operator==:
- 默认实现
operator<=>时:编译器会自动为类生成对应的operator==。因为默认的三路比较运算符基于类成员逐一比较,相等性判断逻辑明确,标准允许编译器同步生成配套的相等运算符,确保==操作正常可用。 - 手动实现
operator<=>时:编译器不会自动生成operator==。标准认为,手动编写三路比较逻辑意味着你可能有自定义排序规则,但相等性判断逻辑未必和三路比较完全一致(比如部分成员不参与排序但参与相等判断),因此不会自动推导生成operator==。此时若未显式定义该运算符,x1 == x2的调用会因找不到合适重载而失效。
解决办法
如果需要在手动实现operator<=>后正常使用==,可选择两种方式:
- 显式定义
operator==:
bool operator==(const X& another) const { return y == another.y; }
- 显式默认生成
operator==:
bool operator==(const X&) const = default;
内容的提问来源于stack exchange,提问作者Necktschnagge
相关产品推荐
相关产品推荐

