【发布时间】:2021-12-23 20:34:14
【问题描述】:
我知道在 C++ 中定义某些运算符可以让编译器为一个类生成其他运算符。从我读到的in this cppreference article 看来,以下情况似乎是正确的:
-
operator==必须明确定义(可能是默认值)才能使用。 -
operator!=是从operator==生成的,如果它没有明确定义并且operator==已经定义。 -
operator<=>生成其他四个关系运算符(如果一切按计划进行,即operator<=>返回一个可能被其他四个解释的结果,并且对于原始参数顺序和反向参数顺序都有很好的定义) -
operator<=>不会生成operator==即使它返回std::strong_ordering,据我了解,当且仅当两个比较对象相同(无法区分)时,它应该返回一个与0相当的对象。我用以下代码自己测试了这个
#include <iostream>
class Foo
{
public:
int x;
int y;
// Lexicographic ordering but by the y member first, and by x second.
std::strong_ordering operator<=>(const Foo& other)
{
if (std::strong_ordering cmp = y <=> other.y; cmp != 0)
return cmp;
return x <=> other.x;
}
};
int main()
{
Foo f = {1, 1}, g = {1, 0};
std::cout << (f == g);
}
返回错误no match for ‘operator==’ (operand types are ‘Foo’ and ‘Foo’)。
我想知道的是,首先,为什么 operator<=> 不生成 operator==,其次 - 是否有完整列表列出哪些运算符生成其他运算符(以及哪些运算符),或者是 cppreference文章在这方面是否完整并且没有其他运算符正在生成?例如,我希望operator+(Foo) 和operator-() 生成operator-(Foo),因为减法只不过是加法逆运算。然而,事实证明这是不真实的,我也对此进行了测试。
【问题讨论】:
-
啊,谢谢你的链接。这也让我想起了我在cppreference文章中看到的一句话:“如果operator是默认的,并且operator==根本没有声明,那么operator==是隐式默认的。”,之前没看懂,及时忘记了。
标签: c++ operator-overloading c++20