Вот мой пример кода:
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 '.'
}
Почему компилятор пытается "переместить ответственность" для оператора- > от Y до X? Когда я реализую X:: op- > , то я не могу вернуть X там - ошибка компиляции говорит о "бесконечной рекурсии", а при возвращении некоторого Z из X:: op- > снова говорит, что Z не имеет оператора- > , таким образом, выше и выше в иерархии.
Может ли кто-нибудь объяснить это интересное поведение?:)