为简单结构体显式实现太空船运算符遇问题求助
显式实现太空船运算符后
==运算符无法匹配的问题分析 核心原因是:当你自定义实现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
相关产品推荐
相关产品推荐

