【发布时间】:2023-03-09 01:42:01
【问题描述】:
我很难理解 Stroustrup 的解释,即如果运算符重载 '.' 会遇到什么困难。被允许。
请参阅 Bjarne Stroustrup 的这句话:
运算符。 (dot) 原则上可以使用与 -> 相同的技术进行重载。但是,这样做可能会导致有关操作是否适用于对象重载的问题。或 引用的对象。例如:
class Y {
public:
void f();
// ...
};
class X { // assume that you can overload .
Y* p;
Y& operator.() { return *p; }
void f();
// ...
};
void g(X& x)
{
x.f(); // X::f or Y::f or error?
}
在上面的例子中,为什么在执行x.f()时会出现任何混乱?
Y& operator.() { return *p; }
这是我的想法:
- operator.() 在 x 上被调用,因此应该调用
Y& operator.()( return *p; }不是很明显和直观吗? - 返回指向 Y 类型对象的
*p时,应最终调用Y::f()(而不是X::f())
我在 Stroustup 的解释中遗漏了什么?为什么不直截了当?
【问题讨论】:
-
"因此
Y::f()应该最终被调用" 但是这不会让阅读该代码的人感到困惑吗?通常x.f()会调用x的f成员,但在这种情况下不会发生。 -
@ScottHunter 好吧,如果这个例子来自 Stroustrup 并且应该说明混淆,难道不应该混淆 :)?
-
这个SO question 谈到了同样的问题。
-
@GregKikola 如果
.重载,你可以调用f真正的非重载->。 -
@AlexD:是的,
(&x)->f()有效。我不清楚你的意思是什么。这怎么可能令人困惑?哪里有歧义的余地?operator.可能不明确,因为x可以有一个名为f的成员,而从operator.返回的任何内容也可以有一个名为f的成员。