auto_ptr (shared_ptr также) стараются сделать их использование максимально прозрачным; то есть, в идеале, вы не должны понимать, используете ли вы auto_ptr или реальный указатель на объект. Рассмотрим:
class MyClass
{
public:
void foo() { }
};
MyClass* p = new MyClass;
auto_ptr<MyClass> ap(new MyClassp);
p->foo(); // No notational difference in using real
ap->foo(); // pointers and auto_ptrs
Когда вы пытаетесь вызвать функцию-член через указатель-член, существует разница, поскольку auto_ptr, очевидно, не реализует op → *():
void (MyClass::*memfun)() = &MyClass::foo;
(p->*memfun)(); // OK
(ap->*memfun)(); // Error op->*() missing
(ap.get()->*memfun)(); // OK
Почему нет поддержки op → *() в auto_ptr и как бы реализовать ее (я экспериментировал некоторое время, но в конечном итоге сдался).