From 66da52fdeb3cd7708bb5e1baa6883667232d2d21 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Tue, 19 Mar 2019 17:08:35 +1100 Subject: [PATCH] expected: add a trivial move constructor --- expected.hpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) 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 {