In every specialization indirect<T, Allocator>,
if the type allocator_traits<Allocator>::value_type
is not the same type as T,
the program is ill-formed.
Every object of type indirect<T, Allocator>
uses an object of type Allocator to allocate and free storage
for the owned object as needed.
Constructing an owned object with args...
using the allocator a means calling
allocator_traits<Allocator>::construct(a, p, args...) where
args is an expression pack,
a is an allocator, and
p is a pointer obtained by
calling allocator_traits<Allocator>::allocate.
A program that instantiates the definition of
the template indirect<T, Allocator> with
a type for the T parameter that is
a non-object type,
an array type,
in_place_t,
a specialization of in_place_type_t, or
a cv-qualified type
is ill-formed.