Duplicar posible:
Overloading operator ->¿Está el operador-> "encadenado" para los punteros?
Hola,
he visto que operator->()
es encadenado (re-aplicado) 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 tres operator->()
para ser evaluado - Foo::operator->()
, Bar::operator->()
y resolución de puntero regular.
Pero no funcionará con punteros en el medio - si Foo::operator->()
devuelve el puntero a la barra en lugar de referencia, no se compilará. Lo mismo ocurre con auto_ptr<auto_ptr<string>>
por ejemplo.
¿Es específico para operator->()
no sobrecargado por lo que solo se aplica una vez y no causa encadenamiento? ¿Es posible hacer que el siguiente código 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!
Duplicado de [Operador de sobrecarga ->] (http://stackoverflow.com/questions/4896238/overloading-operator) [La respuesta de AndreyT explica el comportamiento de 'operator->' y cómo se produce el "encadenamiento".] –
@James Me gustaría mantener esto abierto ya que la redacción de la pregunta es diferente. Puede ayudar a otras personas a encontrar esa respuesta. –
@Judge: una pregunta cerrada no se elimina automáticamente, y una pregunta bien hecha como esta no se eliminará; la pregunta seguirá existiendo y podrá buscarse. –