【问题标题】:Inability to overload Dot '.' operator in c++无法超载点 '.' C++中的运算符
【发布时间】: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; }

这是我的想法:

  1. operator.() 在 x 上被调用,因此应该调用 Y& operator.()( return *p; } 不是很明显和直观吗?
  2. 返回指向 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 的成员。

标签: c++ operator-overloading


【解决方案1】:

有一些进展:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4477.pdf。由于一些技术问题,这不会出现在 C++17 中,但我希望在 C++20 中看到它。

【讨论】:

  • 正是这样的个人资料让我希望 SO 在个人资料页面上有一个“已验证”指示器 :)
  • 这有什么更新吗?我无法跟踪状态。
  • 我们在 c++2a 中有点重载吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多