diff --git a/include/tl/expected.hpp b/include/tl/expected.hpp index b49ff46..ab3ddb2 100644 --- a/include/tl/expected.hpp +++ b/include/tl/expected.hpp @@ -616,9 +616,9 @@ template struct expected_storage_base { //no constexpr for GCC 4/5 bug #else TL_EXPECTED_MSVC2015_CONSTEXPR - #endif + #endif expected_storage_base() : m_has_val(true) {} - + constexpr expected_storage_base(no_init_t) : m_val(), m_has_val(false) {} constexpr expected_storage_base(in_place_t) : m_has_val(true) {} @@ -1499,6 +1499,17 @@ class expected : private detail::expected_move_assign_base, : impl_base(unexpect, e.value()), ctor_base(detail::default_constructor_tag{}) {} + template ::value> * = + nullptr, + detail::enable_if_t::value> * = + nullptr, + detail::enable_if_t::value> * = + nullptr> + explicit constexpr expected(const G &g) + : impl_base(unexpect, g), + ctor_base(detail::default_constructor_tag{}) {} + template < class G = E, detail::enable_if_t::value> * = @@ -1508,6 +1519,16 @@ class expected : private detail::expected_move_assign_base, : impl_base(unexpect, e.value()), ctor_base(detail::default_constructor_tag{}) {} + template < + class G = E, + detail::enable_if_t::value> * = + nullptr, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr> + constexpr expected(G const &g) + : impl_base(unexpect, g), + ctor_base(detail::default_constructor_tag{}) {} + template < class G = E, detail::enable_if_t::value> * = nullptr, @@ -1517,6 +1538,16 @@ class expected : private detail::expected_move_assign_base, : impl_base(unexpect, std::move(e.value())), ctor_base(detail::default_constructor_tag{}) {} + template < + class G = E, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr> + explicit constexpr expected(G &&g) noexcept( + std::is_nothrow_constructible::value) + : impl_base(unexpect, std::move(g)), + ctor_base(detail::default_constructor_tag{}) {} + template < class G = E, detail::enable_if_t::value> * = nullptr, @@ -1526,6 +1557,16 @@ class expected : private detail::expected_move_assign_base, : impl_base(unexpect, std::move(e.value())), ctor_base(detail::default_constructor_tag{}) {} + template < + class G = E, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr> + constexpr expected(G &&g) noexcept( + std::is_nothrow_constructible::value) + : impl_base(unexpect, std::move(g)), + ctor_base(detail::default_constructor_tag{}) {} + template ::value> * = nullptr>