运算符重载

无法更改内置类型的运算符,只能为用户定义的类型重载运算符。也就是说,至少一个操作数必须是用户定义的类型。

以下运算符不能重载:

  • 成员访问或运算符 .
  • 指向成员访问运算符 .*的指针
  • 范围解析运算符::
  • 三元条件运算符 ?:
  • dynamic_caststatic_castreinterpret_castconst_casttypeidsizeofalignof,和 noexcept
  • 预处理指令 ###,它们在任何类型信息可用之前执行。

有些运算符应该 (99.98%的情况下)超载:

  • &&||(相反,更喜欢使用隐式转换为 bool
  • ,
  • 运算符地址(一元 &

为什么?因为它们使另一个程序员可能永远不会想到的运算符超载,导致行为与预期不同。

例如,用户定义的这些运算符的 &&||重载会丢失其短路评估失去其特殊的排序属性(C++ 17) ,排序问题也适用于 , 运算符重载。