¿El operador-> está "encadenado" para los punteros? [duplicar]

Posible duplicado:
Operador de sobrecarga ->

Hola,

He visto esooperator->() se encadena (se vuelve a aplicar) después de que se evalúa, por ejemplo:

struct Bar
{
  Bar() : m_str("Hello world!") {}
  const string* operator->() const { return &m_str; }
  string m_str;
};

struct Foo
{
  const Bar& operator->() const { return m_bar; }
  Bar m_bar;
};

int main()
{
  Foo f;
  cout << f->c_str() << endl;
  return 0;
}

funciona bastante bien, lo que requiere tresoperator->() ser evaluado -Foo::operator->(), Bar::operator->() y resolución de puntero regular.

Pero no funcionará con punteros en el medio, siFoo::operator->() devuelve el puntero a Bar en lugar de referencia, no se compilará. Lo mismo sucede conauto_ptr<auto_ptr<string>> por ejemplo.

¿Es específico para no sobrecargado?operator->() entonces, ¿solo se aplica una vez y no causa encadenamiento? ¿Es posible hacer que el código a continuación funcione sin usar(*ptr2)-> ...?

int main()
{
  string s = "Hello world";
  auto_ptr<string> ptr1(&s);
  auto_ptr<auto_ptr<string> > ptr2(&ptr1);
  cout << ptr1->c_str() << endl; // fine
  cout << ptr2->c_str() << endl; // breaks compilation
}

¡Gracias!

Respuestas a la pregunta(3)

Su respuesta a la pregunta