
在 C 中绝大多数运算符都可以重载但有以下 5 个运算符不能被重载也是标准明确禁止的.成员访问运算符原因用于直接访问类的成员其语义由语言严格定义无法通过重载改变。.成员指针访问运算符原因与 .类似用于通过成员指针访问成员语义固定。::作用域解析运算符原因用于指定命名空间或类的作用域属于编译期符号解析不能作为运行时操作。?:三元条件运算符原因具有特殊的短路求值逻辑且表达式的结果类型取决于两个分支重载会破坏其原有语义。sizeof以及 sizeof…、alignof、typeid、noexcept等运算符注意严格来说sizeof是一个运算符但它不接受用户自定义的操作数类型除了变长数组等特殊情况且其结果在编译期确定无法重载。同样typeid、alignof、noexcept也属于此类。此外预处理运算符 #和 ##也不是 C 运算符重载的范畴它们属于预处理器自然不能重载。总结C 中明确不能重载的运算符主要是 ., ., ::, ?:, sizeof以及 typeid、alignof、noexcept等编译期运算符。其余所有运算符包括 , [], (), -, new, delete等都可以重载但部分运算符如 、()、[]、-只能在类内部作为成员函数重载。