Оператор перегрузки ->

Вот мой пример кода:

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 '.'
}

Почему компилятор пытается «перенести ответственность» за operator-> с Y на X? Когда я реализую X :: op->, я не могу вернуть туда X - ошибка компиляции говорит о "бесконечной рекурсии", а при возврате некоторого Z из X :: op-> снова говорит, что Z не имеет operator->, таким образом поднимаясь выше и выше по иерархии.

Кто-нибудь может объяснить это интересное поведение? :)

18
задан CashCow 4 February 2011 в 10:01
поделиться