You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何默认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<=>后正常使用==,可选择两种方式:

  1. 显式定义operator==:
bool operator==(const X& another) const { return y == another.y; }
  1. 显式默认生成operator==:
bool operator==(const X&) const = default;

内容的提问来源于stack exchange,提问作者Necktschnagge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:36:06