И даже если бы вы могли, как компилятор мог знать, когда должна закончиться рекурсия?
жный дубликат:
Оператор перегрузки ->
Здравствуй,
Я видел этоoperator->()
прикован (повторно применен) после оценки, например:
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;
}
работает довольно хорошо, что требует трехoperator->()
быть оцененным -Foo::operator->()
, Bar::operator->()
и обычное разрешение указателя.
Но это не будет работать с указателями в середине - еслиFoo::operator->()
возвращает указатель на Bar вместо ссылки, он не скомпилируется. То же самое происходит сauto_ptr<auto_ptr<string>>
например.
Это специфично для не перегруженныхoperator->()
так он применяется только один раз и не вызывает цепочки? Можно ли заставить приведенный ниже код работать без использования(*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
}
Спасибо!