无法超载点 '.' C++中的运算符
Posted
技术标签:
【中文标题】无法超载点 \'.\' C++中的运算符【英文标题】:Inability to overload Dot '.' operator in c++无法超载点 '.' C++中的运算符 【发布时间】:2017-06-30 05:35:26 【问题描述】:我很难理解 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
的成员。
【参考方案1】:
有一些进展:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4477.pdf。由于一些技术问题,这不会出现在 C++17 中,但我希望在 C++20 中看到它。
【讨论】:
正是这样的个人资料让我希望 SO 在个人资料页面上有一个“已验证”指示器 :) 这有什么更新吗?我无法跟踪状态。 我们在 c++2a 中有点重载吗?以上是关于无法超载点 '.' C++中的运算符的主要内容,如果未能解决你的问题,请参考以下文章