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

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

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

这个线程很好地解释了禁止operator =作为非成员函数的原理。 关于其他三个任何想法?

原始文章中提到的四个运算符() =()->[] )必须实现为非静态成员函数(分别由C ++ 98§13.5.3/ 1,§13.5.4/ 1 ,§13.5.5/ 1和§13.5.6/ 1)。

Bjarne Stroustrup的理论基础就像我之前关于这个问题的辩论中所回忆的那样,保留了一些语言上的理智,即至less有一些事情可以依靠,不pipe有多less人通过定义非会员运营商已经搞砸了类。

我不确定我是否完全同意这个限制对此有帮助,但是。

编辑 :我咨询了Bjarne Stroustrup关于这个(他总是有帮助的),但似乎规则的明显矛盾只不过是一个冻结的历史事故的情况。 他指出:“现在看起来比现在更糟糕,因为我们自从重载规则制定以来,我们对左值和引用的规则已经发生了变化,几年前我试图再次研究这个问题,但是在产生完整的build议“。

干杯&hth。,

PS:“C ++的devise和发展”一书对于这类问题很有帮助,但不幸的是我没有这个问题。

comp.std.c ++上的这个线程讨论了这个问题。

委员会成员弗朗西斯·格拉斯伯(Francis Glassborow)表示:

语言devise者不想支持operator =的左边操作数的转换和提升,也不支持()和[]的操作数。

试图避免这种情况:

 class A {}; class B { B(A& a) {} }; int operator()(B const& b) { return 0; } int main(void) { A a; // This works even though A doesn't have a () operator // It creates a temporary B and calls operator()(B& b) return a(); }