diff --git a/expected.hpp b/expected.hpp index a240813d..e93d6735 100644 --- a/expected.hpp +++ b/expected.hpp @@ -46,7 +46,18 @@ namespace cruft { using error_type = ErrorT; expected () = delete; - expected (expected &&); + expected (expected &&rhs) + { + destroy (); + if (rhs) { + m_valid = true; + ::new (&m_store.value) ValueT (std::move (rhs.value ())); + } else { + m_valid = false; + ::new (&m_store.error) unexpected (std::move (rhs.error ())); + } + } + expected& operator=(expected &&); expected (expected const&); expected& operator=(expected const&); @@ -71,12 +82,7 @@ namespace cruft { ~expected () { - if (m_valid) { - m_store.value.~ValueT (); - m_valid = false; - } else { - m_store.error.~unexpected (); - } + destroy (); } ValueT& @@ -137,6 +143,16 @@ namespace cruft { explicit operator bool() const noexcept { return has_value (); } private: + void destroy (void) + { + if (m_valid) { + m_store.value.~ValueT (); + m_valid = false; + } else { + m_store.error.~unexpected (); + } + } + bool m_valid = false; union storage_t {