运算符重载的隐式交换性
Implicit commutativity of operator overloading
在C++中,运算符可以重载。如果我有两个类A
和B
,例如我可以重载类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"更改为"复发")将提供这些变体;不要使用它;它太侵入了。
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 交换运算符 + 重载会导致无限递归
- 当试图交换可变模板类时,如何正确地重载operator=
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 运算符重载的隐式交换性
- 交换重载,可以采用 L 值和 R 值引用以及不同类型的引用
- 如何为模板嵌套类编写可交换的重载算术运算符?
- 如何重载加法运算符以进行交换计算
- 为什么两阶段查找无法选择"交换"的重载版本?
- 为什么内存泄漏只发生在赋值运算符重载的情况下,而不是在复制构造函数中,以及复制和交换习惯用法如何解决它
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 通过交换参数顺序来重载函数
- 交换重载算术运算符的形参