It is true that shared_ptr can subsume all other pointers (except weak_ptr for certain situations). However, shared_ptr has more overhead than unique_ptr and scoped_ptr (which is actually not a smart pointer in the standard library). This is because shared_ptr deals with shared ownership and so has to keep a reference count. unique_ptr does not have to do this as so has less overhead. If that's not enough, unique_ptr has more restrictive semantics (i.e. no copying allowed), which leads to less bugs (you usually should think carefully about copy semantics) and it gives a clear message to someone reading the code--at most one pointer will point to whatever the unique_ptr points to at any time.