运算符重载的隐式交换性

Implicit commutativity of operator overloading

本文关键字:交换 重载 运算符      更新时间:2023-10-16

在C++中,运算符可以重载。如果我有两个类AB,例如我可以重载类A中的operator ==以与B的实例进行比较:

class A {
// Some attributes, methods
public:
bool operator ==(const B &b) {
// Implementation of operator ==
}
}

然后我可以运行如下代码:

A a;
B b;
if(a == b) {
// Some code
}

但是,如果我写b == a,编译器会寻找bool operator ==(const A &a)在B类。如果未找到,则C++规范化中是否存在默认行为?编译器(无论它是什么)会在失败时退出还是运行bool operator ==(const B &b)

更好的是,如果它在B类找不到operator < (),它会尝试在A类中operator >=()吗?

不,它也不会。重载运算符没有什么特别之处;它们只是具有有趣语法的重载函数。所以上面的代码a == b是对a.operator==(const B&)的调用。

当然,b == a失败的原因是没有b.operator==(const A&)(同样,也没有全局运算符)。

处理这个问题的通常方法是有一个全局operator==而不是一个成员:bool operator==(const A&, const B&),以及另一个相反的全局operator==bool operator==(const B&, const A&);如果比较实际上是对称的,那么第二个可以通过调用第一个来简单实现:bool operator==(const B& b, const A& a) { return a == b; }

同样的原则也适用于operator<:它不会走另一条路,如果你想要一个这样做的,你必须写它。

(小字:请忽略 - 有std::relops(拼写更正想要将"relops"更改为"复发")将提供这些变体;不要使用它;它太侵入了。