This fails, because the call to operator= is ambiguous. It could be an attempt to call operator=(nullopt_t), or it could be an attempt to call operator=(optional &&), and there is no language rule to resolve this ambiguity.

Therefore, unless there's a change to the language rules, or oi = {}; no longer needs to be valid, either nullopt_t or optional needs to not be default-constructible, and nullopt_t is the logical choice for that.