When an object of an array type U is specified to have
an initial value of u (of the same type),
this shall be interpreted to mean that
each array element of the object has as its initial value
the corresponding element from u.

When a (sub)object of a non-array type U is specified to have
an initial value of v, or U(l...),
where l... is a list of constructor arguments,
make_­shared shall initialize this (sub)object
via the expression ​::​new(pv) U(v) or ​::​new(pv) U(l...) respectively,
where pv has type void* and points to storage
suitable to hold an object of type U.

When a (sub)object of a non-array type U is specified to have
an initial value of v, or U(l...),
where l... is a list of constructor arguments,
allocate_­shared shall initialize this (sub)object
via the expression

respectively,
where pv points to storage
suitable to hold an object of type U and
a2 of type A2 is a rebound copy of
the allocator a passed to allocate_­shared
such that its value_­type is remove_­cv_­t<U>.

When a (sub)object of non-array type U is specified to have
a default initial value,
make_­shared shall initialize this (sub)object
via the expression ​::​new(pv) U(),
where pv has type void* and points to storage
suitable to hold an object of type U.

When a (sub)object of non-array type U is specified to have
a default initial value,
allocate_­shared shall initialize this (sub)object
via the expression allocator_­traits<A2>​::​construct(a2, pv),
where pv points to storage
suitable to hold an object of type U and
a2 of type A2 is a rebound copy of
the allocator a passed to allocate_­shared
such that its value_­type is remove_­cv_­t<U>.

When the lifetime of the object managed by the return value ends, or
when the initialization of an array element throws an exception,
the initialized elements are destroyed in the reverse order
of their original construction.

shared_ptr<double[1024]> p = make_shared<double[1024]>(1.0);
// shared_­ptr to a double[1024], where each element is 1.0shared_ptr<double[6][2]> q = make_shared<double[6][2]>({1.0, 0.0});
// shared_­ptr to a double[6][2], where each double[2] element is {1.0, 0.0}shared_ptr<vector<int>[4]> r = make_shared<vector<int>[4]>({1, 2});
// shared_­ptr to a vector<int>[4], where each vector has contents {1, 2}