C++ 中有 4 个运算符可以重载,但不能作为独立(也称为非成员、独立)函数重载。这些运算符是:
operator =
operator ()
operator ->
operator []
该线程很好地解释了禁止operator =
成为非成员函数的理由。对其他三个有什么想法吗?
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 的理由是,正如我从之前关于该主题的辩论中记得的那样,在语言中保持一些理智,即至少有一些你可以依赖的东西,不管别人通过定义非成员操作符来定义现有的类。
我不确定我是否完全同意限制确实对此有所帮助,但是。
编辑:我就此咨询了 Bjarne Stroustrup(他总是乐于助人),但似乎规则的明显不一致只不过是冻结的历史事故。他指出“现在看起来比以前更糟了,因为自从制定了重载规则以来,我们的左值和引用规则已经发生了变化。几年前我试图再次研究这个问题,但在产生一个完整的提案。”
干杯&hth.,
PS:《The Design and Evolution of C++》这本书非常适合这类问题,可惜我没有。
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();
}