diff --git a/include/tl/optional.hpp b/include/tl/optional.hpp index b7b3d61..ad2cd27 100644 --- a/include/tl/optional.hpp +++ b/include/tl/optional.hpp @@ -409,7 +409,7 @@ template struct optional_operations_base : optional_storage_base { this->m_has_value = false; } - template void construct(Args &&... args) noexcept { + template void construct(Args &&... args) { new (std::addressof(this->m_value)) T(std::forward(args)...); this->m_has_value = true; } diff --git a/tests/emplace.cpp b/tests/emplace.cpp index 4edb319..051096d 100644 --- a/tests/emplace.cpp +++ b/tests/emplace.cpp @@ -11,3 +11,14 @@ TEST_CASE("Emplace", "[emplace]") { REQUIRE(i->second.first == 3); REQUIRE(i->second.second == 4); } + +struct A { + A() { + throw std::exception(); + } +}; + +TEST_CASE("Emplace with exception thrown", "[emplace]") { + tl::optional a; + REQUIRE_THROWS(a.emplace()); +}