为什么重载的复合赋值运算符可以是非成员函数?

Avi*_*sov 3 c++

我最近才发现,复合赋值运算符(例如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->不能成为非成员函数),我认为这就是这个原因。

那么为什么允许呢?

Mar*_*ork 5

那么为什么允许呢?

您是在要求我们阅读Stroustrop的思想。不可能。
但是C ++的一般原则不是限制开发人员(我们没有提供可以安全使用的绝望工具集。我们提供了全套的剃刀锯和旋转fl刀)。

在我看来,这可能会导致严重的代码滥用和混乱的行为。想象一下,有人认为将其用于标准包含(例如std :: vector或std :: map)的“聪明的黑客”会很好。

是的,它可以。
当您滥用操作员过载时,可能会导致一些危险甚至致命的事情。最好不要这样做(尤其是对于其他人或标准班级)。

但这可能会提供一些潜在的有用情况(当您小心时)。当您构建数字“类型”类时,这特别有用,因为它有助于自动转换,使代码更自然地阅读。