我最近才发现,复合赋值运算符(例如operator+=或operator-=)可以在类范围之外重载。
考虑:
class X { }; // A third party class
// The following function is legal:
X& operator+=(X& lhs, const X& rhs) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
显然,非成员函数不能接触的私有接口X,因此这里没有封装问题。但这确实使它看起来像是X自己的接口的一部分,但显然不是。
在我看来,这可能会导致严重的代码滥用和混乱的行为。想象一下,有人认为将其用于带有“” std::vector或“”等标准内容的“聪明的黑客”会很好std::map。
这是特别的,因为其他操作符(例如operator[]和operator->不能成为非成员函数),我认为这就是这个原因。
那么为什么允许呢?
那么为什么允许呢?
您是在要求我们阅读Stroustrop的思想。不可能。
但是C ++的一般原则不是限制开发人员(我们没有提供可以安全使用的绝望工具集。我们提供了全套的剃刀锯和旋转fl刀)。
在我看来,这可能会导致严重的代码滥用和混乱的行为。想象一下,有人认为将其用于标准包含(例如std :: vector或std :: map)的“聪明的黑客”会很好。
是的,它可以。
当您滥用操作员过载时,可能会导致一些危险甚至致命的事情。最好不要这样做(尤其是对于其他人或标准班级)。
但这可能会提供一些潜在的有用情况(当您小心时)。当您构建数字“类型”类时,这特别有用,因为它有助于自动转换,使代码更自然地阅读。