diff --git a/include/tl/expected.hpp b/include/tl/expected.hpp index 7fd6467..e417d03 100644 --- a/include/tl/expected.hpp +++ b/include/tl/expected.hpp @@ -148,6 +148,18 @@ template class unexpected { constexpr explicit unexpected(E &&e) : m_val(std::move(e)) {} + template ::value>::type * = nullptr> + constexpr explicit unexpected(in_place_t, Args &&...args) + : m_val(std::forward(args)...) {} + template < + class U, class... Args, + typename std::enable_if &, Args &&...>::value>::type * = nullptr> + constexpr explicit unexpected(in_place_t, std::initializer_list l, Args &&...args) + : m_val(l, std::forward(args)...) {} + +#ifndef TL_EXPECTED_STRICT template ::value>::type * = nullptr> constexpr explicit unexpected(Args &&...args) @@ -158,6 +170,7 @@ template class unexpected { E, std::initializer_list &, Args &&...>::value>::type * = nullptr> constexpr explicit unexpected(std::initializer_list l, Args &&...args) : m_val(l, std::forward(args)...) {} +#endif constexpr const E &value() const & { return m_val; } TL_EXPECTED_11_CONSTEXPR E &value() & { return m_val; } @@ -465,7 +478,7 @@ struct expected_storage_base { detail::enable_if_t::value> * = nullptr> constexpr explicit expected_storage_base(unexpect_t, Args &&...args) - : m_unexpect(std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, std::forward(args)...), m_has_val(false) {} template il, Args &&...args) - : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { if (m_has_val) { @@ -512,7 +525,7 @@ template struct expected_storage_base { detail::enable_if_t::value> * = nullptr> constexpr explicit expected_storage_base(unexpect_t, Args &&...args) - : m_unexpect(std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, std::forward(args)...), m_has_val(false) {} template struct expected_storage_base { constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, Args &&...args) - : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() = default; union { @@ -553,7 +566,7 @@ template struct expected_storage_base { detail::enable_if_t::value> * = nullptr> constexpr explicit expected_storage_base(unexpect_t, Args &&...args) - : m_unexpect(std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, std::forward(args)...), m_has_val(false) {} template struct expected_storage_base { constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, Args &&...args) - : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { if (!m_has_val) { @@ -598,7 +611,7 @@ template struct expected_storage_base { detail::enable_if_t::value> * = nullptr> constexpr explicit expected_storage_base(unexpect_t, Args &&...args) - : m_unexpect(std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, std::forward(args)...), m_has_val(false) {} template struct expected_storage_base { constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, Args &&...args) - : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { if (m_has_val) { @@ -638,7 +651,7 @@ template struct expected_storage_base { detail::enable_if_t::value> * = nullptr> constexpr explicit expected_storage_base(unexpect_t, Args &&...args) - : m_unexpect(std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, std::forward(args)...), m_has_val(false) {} template struct expected_storage_base { constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, Args &&...args) - : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() = default; struct dummy {}; @@ -668,7 +681,7 @@ template struct expected_storage_base { detail::enable_if_t::value> * = nullptr> constexpr explicit expected_storage_base(unexpect_t, Args &&...args) - : m_unexpect(std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, std::forward(args)...), m_has_val(false) {} template struct expected_storage_base { constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, Args &&...args) - : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + : m_unexpect(in_place, il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { if (!m_has_val) {