A type X is a
valid contained type for optional
if X is an lvalue reference type or a complete non-array object type,
and remove_cvref_t<X> is a type other than in_place_t or nullopt_t.
If a specialization of optional is instantiated with a type T
that is not a valid contained type for optional, the program is ill-formed.
If T is an object type,
T shall meet the Cpp17Destructible requirements (Table 35).