我一直在互联网上寻找答案,但找不到任何答案。给出的唯一原因似乎与不同类型的对象进行比较有关(例如MyClass == int
)。但最常见的用例是将类实例与同一类的另一个实例进行比较,而不是与任何不相关的类型进行比较。
换句话说,我确实理解以下问题:
struct A {
bool operator==(int b);
};
但我找不到任何在最明显的用例中不使用成员函数的充分理由:
struct A {
bool operator==(const A&);
};
- 最规范的重复运算符重载的基本规则和习惯用法是什么?根据经验,“将二元运算符重载为非成员”。
-
运算符重载:成员函数与非成员函数?给出了上面提到的例子 -如果您要将此运算符与另一个类/基元类型的实例一起使用...
-
Cpp核心指南有一个模糊的解释”如果使用成员函数,则需要两个”,我认为这适用于与不同类型的对象进行比较。
- 为什么operator提到“非成员函数通过隐式转换发挥更好的作用",但左操作数似乎又不是该类的实例。
另一方面,成员过多似乎有几个积极的方面:
- 无需与函数交友或为成员提供吸气剂
- 它始终可供班级用户使用(尽管这也可能是缺点)
- 查找没有问题(由于某种原因,这在我们的 GoogleTests 中似乎很常见)
正在超载operator==
作为非成员函数只是一个约定,以使其与其他类中可能的重载保持一致?或者还有其他理由使其成为非会员吗?
好吧,在你的问题中,你确实忘记了const
限定成员函数,写起来会比较困难bool operator==(A&, const A&);
意外地。
如果你有一个隐式构造函数,一个隐式转换为A
或基类operator==
如果优先级较高,则成员函数如果在左侧则无法工作,但如果在右侧则可以。尽管大多数时候隐式转换不是一个好主意,但继承可能会导致问题。
struct A {
A(int); // Implicit constructor
A();
bool operator==(const A&) const;
};
struct B : A {
bool operator==(const B&) const;
};
void test() {
A a;
B b;
// 1 == a; // Doesn't work
a == 1;
// b == a; // Doesn't work; Picks `B::operator==(const B&) const;`
a == b; // Picks `A::operator==(const A&) const`, converting `b` to an `A&`.
// Equality is no longer symmetric as expected
}
未来,随着 C++20operator<=>
,您很可能总是将其实现为成员函数(即auto operator<=>(const T&) const = default;),因此我们知道该指南可能会发生变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)