运算符重载
无法更改内置类型的运算符,只能为用户定义的类型重载运算符。也就是说,至少一个操作数必须是用户定义的类型。
以下运算符不能重载:
- 成员访问或点运算符
. - 指向成员访问运算符
.*的指针 - 范围解析运算符
:: - 三元条件运算符
?: dynamic_cast,static_cast,reinterpret_cast,const_cast,typeid,sizeof,alignof,和noexcept- 预处理指令
#和##,它们在任何类型信息可用之前执行。
有些运算符不应该 (99.98%的情况下)超载:
&&和||(相反,更喜欢使用隐式转换为bool),- 运算符地址(一元
&)
为什么?因为它们使另一个程序员可能永远不会想到的运算符超载,导致行为与预期不同。
例如,用户定义的这些运算符的 && 和||重载会丢失其短路评估并失去其特殊的排序属性(C++ 17) ,排序问题也适用于 , 运算符重载。