std::polymorphic is a wrapper containing dynamically-allocated object of possibly different types with value-like semantics.
An std::polymorphic object manages the lifetime of an owned object. The owned object is of type T or any type (publicly and unambiguously) derived from T. An std::polymorphic object can only have no owned object after it has been moved from, in this case it is valueless .
Every object of type std::polymorphic<T, Allocator> uses an object of type Allocator to allocate and free storage for the owned object as needed.
If a program declares an explicit or partial specialization of std::polymorphic, the behavior is undefined.