equivalent to: using std::swap; swap(unex, rhs.unex);
For the case where rhs.has_value() is false and
this->has_value() is true, equivalent to:
construct_at(addressof(unex), std::move(rhs.unex));
destroy_at(addressof(rhs.unex));
has_val=false;
rhs.has_val=true;