重载运算符 - >

use*_*855 18 c++ overloading operator-keyword

这是我的代码示例:

class X
{
public:
        void f() {}
};

class Y : public X
{
public:
        X& operator->() { return *this; }
        void f() {}
};

int main()
{
        Y t;
        t.operator->().f(); // OK
        t->f(); // error C2819: type 'X' does not have an overloaded member 'operator ->'
                // error C2232: '->Y::f' : left operand has 'class' type, use '.'
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器试图将operator->的责任从Y移到X?当我实现X :: op->然后我不能返回X那里 - 编译错误说"无限递归",而从X :: op->返回一些Z再次说Z没有operator->,因此更高和等级越高.

谁能解释这个有趣的行为?:)

tem*_*def 19

问题是operator ->应该返回指针而不是引用.我们的想法是operator ->应该返回指向应该将指针应用于它的真实对象的指针.例如,对于具有重载的类operator ->,代码

myClass->myValue;
Run Code Online (Sandbox Code Playgroud)

翻译成

(myClass.operator-> ())->myValue;
Run Code Online (Sandbox Code Playgroud)

你的代码的问题是operator ->返回一个引用,所以写

myClass.operator->().f();
Run Code Online (Sandbox Code Playgroud)

是完全合法的,因为你明确地调用了运算符,但写作

myClass->f();
Run Code Online (Sandbox Code Playgroud)

是非法的,因为编译器正在尝试将其扩展为

myClass.operator->()->f();
Run Code Online (Sandbox Code Playgroud)

并且返回类型operator->不是指针.

要解决此问题,请更改代码,以便返回指针operator ->.如果要重载运算符以返回引用,则重载operator *; 指针引用应该确实产生引用.

  • 我不会说它假设返回一个指针,只要它返回它需要支持`operator->`. (9认同)

AnT*_*AnT 19

因为这是->C++中重载的方式.

当您使用重载时->,表达式a->b被翻译成a.operator->()->b.这意味着您的重载运算符->必须返回一些本身支持另一个运算符应用程序的东西->.由于这个原因,单个重载调用->可能会转变为重载->s 的长链调用,直到它最终到达内置的应用程序->,从而结束链.

在你的情况下,你需要X*从你的重载返回->,而不是X&.