¿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!