21

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

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

该线程很好地解释了禁止operator =成为非成员函数的理由。对其他三个有什么想法吗?

4

2 回答 2

20

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

Bjarne Stroustrup 的理由是,正如我从之前关于该主题的辩论中记得的那样,在语言中保持一些理智,即至少有一些你可以依赖的东西,不管别人通过定义非成员操作符来定义现有的类。

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

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

干杯&hth.,

PS:《The Design and Evolution of C++》这本书非常适合这类问题,可惜我没有。

于 2010-10-14T22:40:02.787 回答
2

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

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

语言设计者不想支持运算符 = 左侧操作数的转换和提升,也不支持 () 和 [] 的操作数。

尽量避免以下情况:

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();                   
}
于 2010-10-14T23:27:16.163 回答