void swap(Expected& rhs) { if (gotHam) { if (!rhs.gotHam) { auto t = std::move(rhs.spam); new(&spam) std::exception_ptr(t); std::swap(gotHam, rhs.gotHam); } } else { if (rhs.gotHam) { rhs.swap(*this); } else { spam.swap(rhs.spam); std::swap(gotHam, rhs.gotHam); } } }