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
auto_ptr で op->*() がサポートされていないのはなぜですか、またどのように実装するのでしょうか (私はしばらく実験しましたが、最終的にはあきらめました)。