0

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

struct type_a{
   int member;
};

struct type_b{
   int member;
};

我想使用这个新的 C++20 宇宙飞船操作,每个人都说它很酷,可以写type_a{} == type_b{}。我没能做到。即使我operator<=>在它们之间写,我也只能调用type_a{} <=> type_b{},但从来没有简单的比较。这让我很困惑,因为只有一个类,三向比较也定义了所有其他类。

替代配方?如何使它成为std::three_way_comparable_with<type_a, type_b>真的?

4

2 回答 2

2

问题的前提是错误的。您不使用三路比较运算符 ( <=>) 来实现==:您使用==来实现==

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

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

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;
};

但它不是<=>给你==的:它仍然是==,也是唯一==的,给你==

于 2022-01-13T19:34:03.697 回答
-1

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

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<=> 之前的解决方案,但现在定义通用类型的比较更简单。

于 2022-01-13T19:42:52.163 回答