如何使用三向比较(飞船op)实现不同类型之间的operator==?

How to use three-way comparison (spaceship op) to implement operator== between different types?

简单任务:我有这两种类型

struct type_a{
   int member;
};

struct type_b{
   int member;
};

我想用这个新的C++20 ship op,人人都说酷到可以写type_a{} == type_b{}。我没能做到。即使我在它们之间写operator<=>,我也只能调用type_a{} <=> type_b{},而不能进行简单的比较。这让我感到困惑,就像单个 class,三向比较也定义了所有其他的。

替代方案?如何使 std::three_way_comparable_with<type_a, type_b> 为真?

题目前提错误。你不使用三向比较运算符(<=>)来实现==:你使用==来实现==

bool operator==(type_a a, type_b b) {
    return a.member == b.member;
}

混淆的根源在于这条规则有一个例外:如果一个类型声明了一个 defaulted <=> 那么它 also 声明一个 默认 ==:

struct type_c {
    int member;
    auto operator<=>(type_c const&) const = default;
};

该声明相当于写了:

struct type_c {
    int member;
    bool operator==(type_c const&) const = default;
    auto operator<=>(type_c const&) const = default;
};

但是给你 == 的不是 <=>:它仍然是 ==,而且只有 == 给你 ==

我建议将一种类型转换为另一种类型:

struct type_a{
   int member;
   friend auto operator<=>(const type_a&, const type_a&) = default;
};

struct type_b{
   int member;
   operator type_a() {
       return {member};
   }
};

这也是 operator<=> 之前的解决方案,但现在定义通用类型的比较更简单。