O operador está "encadeado" para ponteiros? [duplicado]
Possível duplicado:
Operador de sobrecarga ->
Oi,
Eu vi issooperator->()
é encadeado (reaplicado) após ser avaliado, por exemplo:
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 muito bem, o que requer trêsoperator->()
a ser avaliada -Foo::operator->()
, Bar::operator->()
e resolução regular do ponteiro.
Mas não funcionará com ponteiros no meio - seFoo::operator->()
retorna o ponteiro para Bar em vez de referência, ele não será compilado. O mesmo acontece comauto_ptr<auto_ptr<string>>
por exemplo.
É específico para não sobrecarregadooperator->()
portanto, é aplicado apenas uma vez e não causa encadeamento? É possível fazer o código abaixo funcionar sem 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
}
Obrigado!