为简单结构体定义太空船运算符

3
我正在尝试显式实现飞船运算符。 以下是一个简单的示例,但它失败了。我做错了什么? godbolt链接
#include <iostream>

struct Foo {
    int value;

    // both work
    auto operator<=>(const Foo&) const = default;
    //bool operator==(const Foo other) const { return value == other.value; }

    // both fail
    // auto operator<=>(const Foo& other) const { return value <=> other.value; }
    // auto operator<=>(const Foo other) const { return value <=> other.value; }
};

// fails
//auto operator<=>(const Foo lhs, const Foo rhs) { return lhs.value <=> rhs.value; }

int main(){
    Foo x{0};
    std::cout << (x == x) << '\n';
}

“Fails” 是什么意思? - tkausl
@tkausl 编译时错误(显然非常长 ;))。请参见godbolt链接。 - jack
我查看了Matt Godbolt网站上的链接,那里没有编译时错误。 - Eljay
你需要对“work”部分的两个实现进行注释,并取消其中一个“fail”实现的注释。 - jack
当代码定义了一个非=defaultoperator<=>时,它忘记提供一个显式的operator== - Eljay
2个回答

2

operator<=>实际上并没有实现==运算符。必须从operator<=>单独定义operator==。因此,您需要同样定义operator==

原因是通常可以比<=>更有效地实现==


3
为了更加清晰明确,operator<=>(...) = default确实声明了一个默认的operator==。但是,显式实现operator<=>并不提供operator==。这就是为什么OP的default示例可以工作,尽管从未为其类实现operator==。请参见https://en.cppreference.com/w/cpp/language/default_comparisons。 - Silvio Mayolo
谢谢你们两位!@SilvioMayolo,这让答案更清晰了。 - jack
如果操作符<=>被默认化且操作符==根本没有声明,那么操作符==会被隐式地默认化。 - madhur4127
@Sam Varshavchik,你能否请修正一下你的回答。 - madhur4127

2
根据@Silvio Mayolo的链接:https://en.cppreference.com/w/cpp/language/default_comparisons 如果默认使用operator<=>,而没有声明operator==,那么operator==将会被隐式地默认。因此,在这个定义中: auto operator<=>(const Foo& other) const { return value <=> other.value; } operator==不会被隐式声明,因此编译器会报错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接