为什么不能重载&&、||
对于&&和||操作符,存在"骤死式"评估方式
例如if (expression1 && expression2)
,如果expression1为false,不会计算expression2。
对于if (expression1 || expression2)
,如果expression1 为true,不会计算expression2。
重载&&和||操作符,将从根本上改变这个规则,因此从此"函数调用"会取代"骤死式语义"。
对于式子:
if (expression1 && expression2)
…会被编译器视为 if (expression1.operator && (expression2)).
… // 成员函数版本
或者
if (operator && (expression1, expression2)
… // 全局函数版本
这种函数调用语义和骤死式语义截然不同。
首先,当函数调用动作被执行时,所有参数都必须评估我拿出,所以当我们调用operator&&和operator||时,两个参数都已评估完成,也就是没有了骤死式语义。
其次,C++语言规定并未明确定义函数调用中各参数的评估顺序,所以没办法直到expression1和expression2那个先被评估。
这与骤死式评估行程一个明确的对比,后者总是由左向右评估器自变量。
所以,如果将&&或者||重载,就没有办法提供预期的某种行为模式。
为什么不能重载逗号表达式
对于逗号表达式,逗号左侧会先被评估,然后逗号的右侧再被评估;最后,这个表达式的结果以逗号右侧的值为代表。
如果重载了逗号表达式,无法保证左侧表达式会比右侧表达式先被评估,编译器无法做出保证。
哪些不能被重载:
.
、.*
、 ::
、 ?:
、 new
、 delete
、 sizeof
、 typeif
static_cast
、dynamic_cast
、const_cast
、reinterpret_cast
哪些操作符可以被重载:
其他的都行
总结:
允许重载的操作符,就可以进行重载,但是不能忘记重载的目的,是为了让程序更容器被阅读、被撰写、被理解。
如果没有好的理由重载某个操作符,就不要重载。