Simple shared pointer implementation in a single threaded environment (revised)
Unless this is just for learning, always remember that adding yet another smart-pointer will seriously hinder interaction with anyone expecting a different one.

The Design:


The maker-function is mandatory:


Cannot use a different allocator.
Cannot generally be used to allow sharing across DLL boundaries, as DLLs (in contrast to SOs) don't do symbol unification.
Cannot be used with already-allocated resources, or those needing different deallocation.

Your shared-pointers must always point to the full object. Interior pointers are not allowed, nor are base-pointers.
You don't allow for weak pointers at all.
As an aside, the overhead of using atomic reference-counts is small enough that the standard library eschews the complication of adding single-threaded shared-pointers. Consider whether that's really the part you should save on.


The Implementation:


Using in-class-initializers allows you to simplify the ctors.
You could use aggregate-initialization with Pair, no need for a custom ctor.
Explicitly testing for self-assignment is a bad idea, as it pessimises the common case. Anyway, it's completely useless in a ctor!
You should know that -&gt; binds stronger than anything but scope-resolution ::. If you need to, there are many places to look up the operator precedence rules.
Your move-assignment-operator leaks the assignee's state. Fix it by just doing an unconditional swap instead.