(see also my little post on auto_ptr implementation, and http://www.revergestudios.com/reblog/index.php?n=ReCode.SharedPtr) Any Smart pointer must be a drop-in replacement for a raw ptr. At the minimum this requires
– overload deref operator
– overload arrow operator
– when an existing func requires a raw ptr argument, you can pass in smart ptr — Implicit conversion by …. 
– when an existing func returns raw ptr, but you receive it in a smart ptr — Implicit conversion by …… 
Above the minimum, it needs
+ [optional] overload increment/decrement? This is indeed part of the drop-in deal. Not easy. Not widely implemented.
+ ctor, dtor, copier, op=
+ how about explicit cast between smart ptr and the corresponding  raw ptr? Not part of drop-in replacement.
+ overload address-of operator? I feel no need
+ overload reference to the smart ptr? I feel no need
However, there’s a more stringent requirement that shared_ptr, auto_ptr don’t meet … same size as a raw ptr. Which smart ptr can achieve this? 
How about const_cast, dynamic_cast and upcast on raw pointer??
 smart ptr is parametrized so each concrete smart ptr type covers one type of raw ptr
 conversion ctor??
 operator-overload conversion method