void swap(value& rhs) { if (this->__hasData) { if (!rhs.__hasData) { auto t = std::move(rhs.__excpt); new(std::addressof(this->__excpt)) std::exception_ptr(t); std::swap(this->__hasData, rhs.__hasData); } } else { if (rhs.__hasData) { rhs.swap(*this); } else { std::swap(this->__excpt, rhs.__excpt); // inline function in <exception> std::swap(this->__hasData, rhs.__hasData); } } }
void swap(value& rhs) { if (this->__hasData) { if (rhs.__hasData) { using std::swap; swap(__data, rhs.__data); // may call swap again } else { auto t = std::move(rhs.__excpt); new(std::addressof(rhs.__data)) T(std::move(__data)); new(std::addressof(this->__excpt)) std::exception_ptr(t); std::swap(this->__hasData, rhs.__hasData); } } else { if (rhs.__hasData) { rhs.swap(*this); } else { std::swap(this->__excpt, rhs.__excpt); // inline function in <exception> //spam.swap(rhs.spam); std::swap(this->__hasData, rhs.__hasData); } } }