为异构宇宙飞船算子定义合成了哪些等式/比较算子?

问题描述

C++20 引入了新的宇宙飞船运算符 <=>,它允许根据三向比较的顺序强度合成相等和比较运算符。

但是,似乎在使用以下执行异构比较的简单玩具示例时,它无法合成相等运算符——但仍然可以成功合成排序运算符——尽管有 std::strong_ordering

#include <compare>
#include <cassert>

template <typename T>
struct Wrapper {
    int value;

    auto operator<=>(const Wrapper&) const = default;

    template <typename U>
    auto operator<=>(const Wrapper<U>& other) const {
        return value <=> other.value;
    }
};

void test() {
    // Same type equality -- works
    assert(Wrapper<Foo>{42} == Wrapper<Foo>{42});

    // Heterogeneous comparison -- works
    assert(Wrapper<Foo>{42} < Wrapper<Bar>{45});

    // Heterogeneous equality -- doesn't work?
    assert(Wrapper<Foo>{42} == Wrapper<Bar>{42});
}

在 GCC 上,这会产生以下错误

<source>: In function 'void test()':
<source>:26:29: error: no match for 'operator==' (operand types are 'Wrapper<Foo>' and 'Wrapper<Bar>')
   26 |     assert(Wrapper<Foo>{42} == Wrapper<Bar>{42});
      |            ~~~~~~~~~~~~~~~~ ^~ ~~~~~~~~~~~~~~~~
      |            |                   |
      |            Wrapper<Foo>        Wrapper<Bar>

Live Example

据我从 cppreference 得知的,强序 <=>自动合成运算符应该包括相等性——但异构比较似乎并非如此,但是用于同质比较。

这在 gccclang 甚至 MSVC 上都失败了——所以我很确定这是正确的行为,尽管出乎意料。我知道这可以通过定义自定义 operator== 以及解决,但我的问题主要是为什么会发生这种情况,我可以期望从异构 operator<=> 定义中生成

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)