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