#
template<class T, ..>
constexpr shared_ptr<T> make_shared(args);
template<class T, class A, ..>
constexpr shared_ptr<T> allocate_shared(const A& a, args);
template<class T, ..>
constexpr shared_ptr<T> make_shared_for_overwrite(args);
template<class T, class A, ..>
constexpr shared_ptr<T> allocate_shared_for_overwrite(const A& a, args);
template<class T, class. Args>
constexpr shared_ptr<T> make_shared(Args&&. args); / T is not array
template<class T, class A, class. Args>
constexpr shared_ptr<T> allocate_shared(const A& a, Args&&. args); / T is not array
template<class T>
constexpr shared_ptr<T> make_shared(size_t N); / T is U[]
template<class T, class A>
constexpr shared_ptr<T> allocate_shared(const A& a, size_t N); / T is U[]
template<class T>
constexpr shared_ptr<T> make_shared(); / T is U[N]
template<class T, class A>
constexpr shared_ptr<T> allocate_shared(const A& a); / T is U[N]
template<class T>
constexpr shared_ptr<T> make_shared(size_t N,
const remove_extent_t<T>& u); / T is U[]
template<class T, class A>
constexpr shared_ptr<T> allocate_shared(const A& a, size_t N,
const remove_extent_t<T>& u); / T is U[]
template<class T>
constexpr shared_ptr<T> make_shared(const remove_extent_t<T>& u); / T is U[N]
template<class T, class A>
constexpr shared_ptr<T> allocate_shared(const A& a,
const remove_extent_t<T>& u); / T is U[N]
template<class T>
constexpr shared_ptr<T> make_shared_for_overwrite();
template<class T, class A>
constexpr shared_ptr<T> allocate_shared_for_overwrite(const A& a);
template<class T>
constexpr shared_ptr<T> make_shared_for_overwrite(size_t N);
template<class T, class A>
constexpr shared_ptr<T> allocate_shared_for_overwrite(const A& a, size_t N);