http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/
default (1) constexpr shared_ptr() noexcept;
from null pointer (2) constexpr shared_ptr(nullptr_t) : shared_ptr() {}
from pointer (3) template <class U> explicit shared_ptr (U* p);
with deleter (4) template <class U, class D> shared_ptr (U* p, D del);
template <class D> shared_ptr (nullptr_t p, D del);
with allocator (5) template <class U, class D, class Alloc> shared_ptr (U* p, D del, Alloc alloc);
template <class D, class Alloc> shared_ptr (nullptr_t p, D del, Alloc alloc);
copy (6) shared_ptr (const shared_ptr& x) noexcept;
template <class U> shared_ptr (const shared_ptr<U>& x) noexcept;
copy from weak (7) template <class U> explicit shared_ptr (const weak_ptr<U>& x);
move (8) shared_ptr (shared_ptr&& x)