std::indirect is a wrapper containing dynamically-allocated object with value-like semantics.
An std::indirect object manages the lifetime of an owned object. An std::indirect object can only have no owned object after it has been moved from, in this case it is valueless .
Every object of type std::indirect<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::indirect, the behavior is undefined.