我最近才发现,复合赋值运算符(如operator+=
或operator-=
)可以在类作用域之外进行重载。
比如:
class X { }; // A third party class
// The following function is legal:
X& operator+=(X& lhs, const X& rhs) {
// ...
}
显然,非成员函数无法访问X的私有接口,因此这里没有封装问题。但它确实使它看起来像是X自己的接口的一部分,而事实上并不是。
我认为这可能会导致严重的代码滥用和混乱的行为。想象一下,有人认为使用它与标准容器(如std::vector或std::map)进行一些“聪明的黑客攻击”会很好。
这特别奇怪,因为我认为operator[]和operator->等其他运算符不能是非成员函数,原因就是这个。
那么为什么允许这样做呢?