There was a reason, which was that [expr.const] had previously forbid:
an assignment expression or invocation of an assignment operator ([class.copy]) that would change the active member of a union;
That restriction no longer exists as a result of P1330: Changing the active member of a union inside constexpr, which makes all of these things much easier to implement (the paper literally just removes the bullet point I quoted above).
The reason that optional
's copy and move assignment (but none of the other assignments) were constexpr
was because they can just be defaulted for trivial types.
std::optional
has several such assignment operators. – Doggy