И даже если бы вы могли, как компилятор мог знать, когда должна закончиться рекурсия?

жный дубликат:
Оператор перегрузки ->

Здравствуй,

Я видел это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
}

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос