强制某些运营商成为成员的理由

Arm*_*yan 22 c++ operator-overloading c++-faq

C++中有4个运算符可以重载但不能作为独立(即非成员,独立)函数重载.这些运营商是:

  • operator =
  • operator ()
  • operator ->
  • operator []

这个主题完全解释了禁止operator =成为非成员函数的理由.关于其他三个的任何想法?

Che*_*Alf 19

在原始张贴提到的四个操作员,=,(),->[],必须确实被实现为非静态成员函数(分别由C++ 98§13.5.3/ 1,§13.5.4/ 1,§13.5.5/ 1和§13.5.6/ 1).

Bjarne Stroustrup的理由是,我从之前关于这个问题的辩论中回忆起,保留一些语言的理智,即至少有一些你可以依赖的东西,无论多少人通过定义现有的非成员操作员搞砸了类.

我不确定我是否完全同意限制确实对此有所帮助,但是.

编辑:我咨询了Bjarne Stroustrup(他总是乐于助人)但似乎规则的明显不一致只不过是冻结历史事故的案例.他指出"现在看起来比现在看起来更糟糕了,因为自从制定了超载规则以来我们对左值和参考的规则发生了变化.几年前我试图再次研究这个问题,但是在产生一个问题之前已经没时间了完整的提案."

干杯&hth.,

PS:"C++的设计和演变"一书很适合这类问题,但不幸的是我没有.