Any instance of optional<T> at any given time either contains a value or does not contain a value.
When an instance of optional<T>contains a value,
it means that an object of type T, referred to as the optional object's contained value,
is nested within ([intro.object]) the optional object.
When an object of type optional<T> is contextually converted to bool,
the conversion returns true if the object contains a value;
otherwise the conversion returns false.
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).