std::optional<T> has a converting move constructor,
template < class U >
constexpr optional( optional<U>&& other );
with the requirements that T is not constructible from std::optional<U>,
and std::optional<U> is not convertible to T.
See
https://en.cppreference.com/w/cpp/utility/optional/optional.
Daniel