std::optional has the following constructor:
template < class U = T > constexpr optional( U&& value ); The question here is: why template parameter U is defaulted to type T? What happens if simply change constructor to following:
template < class U /* = T */> constexpr optional( U&& value );