diff --git a/include/tl/expected.hpp b/include/tl/expected.hpp index 9bc01b1..b892923 100644 --- a/include/tl/expected.hpp +++ b/include/tl/expected.hpp @@ -138,6 +138,19 @@ public: constexpr explicit unexpected(E &&e) : m_val(std::move(e)) {} + + template ::value>::type * = nullptr> + constexpr explicit unexpected(Args &&...args) + : m_val(std::forward(args)...) {} + template < + class U, class... Args, + typename std::enable_if &, Args &&...>::value>::type * = nullptr> + constexpr explicit unexpected(std::initializer_list l, + Args &&...args) + : m_val(l, std::forward(args)...) {} + constexpr const E &value() const & { return m_val; } TL_EXPECTED_11_CONSTEXPR E &value() & { return m_val; } TL_EXPECTED_11_CONSTEXPR E &&value() && { return std::move(m_val); } diff --git a/tests/issues.cpp b/tests/issues.cpp index 044390b..6c73f29 100644 --- a/tests/issues.cpp +++ b/tests/issues.cpp @@ -164,6 +164,23 @@ TEST_CASE("Issue 122", "[issues.122]") { #ifdef __cpp_deduction_guides TEST_CASE("Issue 89", "[issues.89]") { auto s = tl::unexpected("Some string"); - REQUIRE(s.value() == "Some string"); + REQUIRE(s.value() == std::string("Some string")); } -#endif \ No newline at end of file +#endif + +struct S { + int i = 0; + int j = 0; + S(int i) : i(i) {} + S(int i, int j) : i(i), j(j) {} +}; + +TEST_CASE("Issue 107", "[issues.107]") { + tl::expected ex1(tl::unexpect, 2); + tl::expected ex2(tl::unexpect, 2, 2); + + REQUIRE(ex1.error().i == 2); + REQUIRE(ex1.error().j == 0); + REQUIRE(ex2.error().i == 2); + REQUIRE(ex2.error().j == 2); +} \ No newline at end of file