gpt4 book ai didi

c++ - 三路比较替换除 == 之外的所有其他比较运算符

转载 作者:行者123 更新时间:2023-12-02 08:23:45 24 4
gpt4 key购买 nike

在 g++ 10 中,我尝试使用三路比较,仅供实验。

我读到不再需要其他运算符(除了 ==)。

但即使我可以使用运算符(它是在编译器上实现的),它也不会取代(或暗示)!=。

所以,下面的代码不起作用。

#include<iostream>

using namespace std;

struct A
{
struct Iterator
{
size_t index;
size_t operator*() { return index + 1000; }
//bool operator!=(const Iterator &a) const { return index != a.index; }
auto operator<=>(const Iterator &a) const { return index <=> a.index; }
Iterator &operator++() { ++index; return *this; }
};
Iterator begin() { return Iterator{0}; }
Iterator end() { return Iterator{5}; }
};


int main()
{
A a;
auto result = a.begin() <=> a.end();
for (auto b : a)
cout << b << "\n";
cout << (a.begin() != a.end()) << "\n";

return 0;
}

我在这里缺少什么?

最佳答案

I read that other operators do not needed anymore (except ==).

对,除了 ==是关键位。比较运算符有两类:

  • 相等运算符( ==!= )
  • 排序运算符( <=><><=>= )

在每个类别中,我列出的第一个( ==<=> )是主要比较运算符。如果您想选择加入该类别,它是您需要定义的唯一运算符。如果您想要平等,请提供== 。如需订购请提供<=> (还有 == )。其他比较运算符是辅助比较运算符 - 使用辅助比较的表达式在 C++20 中被重写为使用主比较运算符。

这些类别完全不同 - 没有交叉。一个x != y表达式可以调用operator==(x, y)甚至 operator==(y, x)但它永远不会调用 operator<=>任何形式的。

您的代码需要进行相等比较,但没有定义相等运算符,因此它的格式不正确。要使其正常工作,您需要添加:

bool operator==(const Iterator &a) const { return index == a.index; }
auto operator<=>(const Iterator &a) const { return index <=> a.index; }

注意== ,不是!= 。您不应该在 C++20 中声明辅助比较运算符,除非您对它们有非常具体的需要(而这不是这样的需要)。

有关更多信息,请参阅Comparisons in C++20 .

<小时/>

此规则的唯一异常(exception)是,为了方便起见,如果您默认 operator<=>那么您会得到一个已声明的默认operator== 。就好像你自己都违约了一样。在此示例中,由于您的比较只是默认的成员比较,因此您可以编写:

auto operator<=>(const Iterator &a) const = default;

作为您的单个比较运算符声明,其行为就像您编写的那样:

bool operator==(const Iterator &a) const = default;
auto operator<=>(const Iterator &a) const = default;

这为您提供了程序所需的正确相等运算符。

关于c++ - 三路比较替换除 == 之外的所有其他比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60681266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com