无法超载点 '.' 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() 会调用xf 成员,但在这种情况下不会发生。 @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++中的运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++重载运算符小结与注意点

C++中不可重载5个运算符

Python 中的 ^=、-= 和 += 符号

无法在具有自定义运算符 ==() 的 c++ 无序集中找到用户定义的类型

除了按位与之外还有其他用途吗[重复]

C++大纲及疑惑点三