In every specialization polymorphic<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 polymorphic<T, Allocator>
uses an object of type Allocator to
allocate and free storage for the owned object as needed.
Constructing an owned object of type U with args...
using the allocator a means calling
allocator_traits<Allocator>::cop, args...) where
args is an expression pack,
a is an allocator, and
p points to storage suitable for an owned object of type U.
The member alloc is used for
any memory allocation and element construction
performed by member functions
during the lifetime of each polymorphic value object, or
until the allocator is replaced.
The allocator may be replaced only via
assignment or swap().
Allocator replacement is performed by
copy assignment,
move assignment, or
swapping of the allocator
only if ([container.reqmts]):
A program that instantiates the definition of polymorphic for
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.