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

为简单结构体显式实现太空船运算符遇问题求助

显式实现太空船运算符后==运算符无法匹配的问题分析

核心原因是:当你自定义实现operator<=>时,编译器不会自动生成对应的operator==,而默认版本的operator<=>(即= default)会同时生成operator==,这就是你的代码中x == x编译失败的关键。

具体细节说明

  • 默认太空船运算符:使用auto operator<=>(const Foo&) const = default;时,编译器会自动生成完整的三路比较逻辑,同时也会隐式生成operator==,因此x == x能正常匹配调用。
  • 自定义太空船运算符:无论是成员函数形式还是非成员函数形式的自定义operator<=>,编译器都不会自动生成operator==。此时代码中没有可用的operator==重载,导致x == x无法找到匹配的运算符,编译报错。

修正方案

有两种可行的修正方式:

方式一:显式实现operator==

在结构体中添加对应的operator==重载,与自定义operator<=>配合使用:

#include <iostream>

struct Foo {
    int value;

    auto operator<=>(const Foo& other) const { return value <=> other.value; }
    // 显式实现==运算符
    bool operator==(const Foo& other) const { return value == other.value; }
};

int main(){
    Foo x{0};
    std::cout << (x == x) << '\n'; // 正常编译输出1
}

方式二:默认生成operator==

如果结构体的成员都是可默认比较的,可以直接让operator==默认生成,无需手动实现:

#include <iostream>

struct Foo {
    int value;

    auto operator<=>(const Foo& other) const { return value <=> other.value; }
    // 让编译器默认生成==运算符
    bool operator==(const Foo& other) const = default;
};

int main(){
    Foo x{0};
    std::cout << (x == x) << '\n'; // 正常编译输出1
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:05:31