From 0b86e9b8434f77c8552aa6c81a19ec4642146fd1 Mon Sep 17 00:00:00 2001 From: Yuming He Date: Thu, 25 Jun 2026 16:52:10 +0800 Subject: [PATCH 1/3] feat: implement LWG-4222 Signed-off-by: Yuming He --- include/zeus/expected.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/zeus/expected.hpp b/include/zeus/expected.hpp index 864be89..60ac325 100644 --- a/include/zeus/expected.hpp +++ b/include/zeus/expected.hpp @@ -291,7 +291,8 @@ using enable_forward_t = std::enable_if_t< !std::is_same_v, expected_detail::remove_cvref_t> && // !expected_detail::is_specialization_v, unexpected> && // (!std::is_same_v, bool> || // LWG-3836 - !expected_detail::is_specialization_v, expected>) // + !expected_detail::is_specialization_v, expected>) && // + !std::is_same_v, unexpect_t> // LWG-4222 >; template From ebddcdb191fc9be8bbf1e9327d878fce13903e32 Mon Sep 17 00:00:00 2001 From: Yuming He Date: Thu, 25 Jun 2026 16:52:45 +0800 Subject: [PATCH 2/3] test: add tests for LWG-4222 Signed-off-by: Yuming He --- tests/test_expected/CMakeLists.txt | 1 + tests/test_expected/lwg_4222_tests.cpp | 30 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 tests/test_expected/lwg_4222_tests.cpp diff --git a/tests/test_expected/CMakeLists.txt b/tests/test_expected/CMakeLists.txt index 2d47aeb..01cc0d2 100644 --- a/tests/test_expected/CMakeLists.txt +++ b/tests/test_expected/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES equality_tests.cpp lwg_3886_tests.cpp lwg_4031_tests.cpp + lwg_4222_tests.cpp ) find_package(Catch2 3 REQUIRED) diff --git a/tests/test_expected/lwg_4222_tests.cpp b/tests/test_expected/lwg_4222_tests.cpp new file mode 100644 index 0000000..173f51f --- /dev/null +++ b/tests/test_expected/lwg_4222_tests.cpp @@ -0,0 +1,30 @@ +#include + +#include + +using namespace zeus; + +namespace +{ + +struct ConstructibleFromUnexpect +{ + ConstructibleFromUnexpect() = default; + explicit ConstructibleFromUnexpect([[maybe_unused]] unexpect_t ut) {} +}; + +} // namespace + +TEST_CASE("expected(unexpect) is not ambiguous when T is constructible from unexpect_t", "[LWG-4222]") +{ + expected e(unexpect); + CHECK_FALSE(e.has_value()); + CHECK(e.error() == int {}); +} + +TEST_CASE("expected(unexpect, args) still works when T is constructible from unexpect_t", "[LWG-4222]") +{ + expected e(unexpect, 42); + CHECK_FALSE(e.has_value()); + CHECK(e.error() == 42); +} From e875e3eadece0b5131d040c49fb7c096725d9d27 Mon Sep 17 00:00:00 2001 From: Yuming He Date: Thu, 25 Jun 2026 16:54:19 +0800 Subject: [PATCH 3/3] doc: add features of LWG-4222 Signed-off-by: Yuming He --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 558192b..6759c22 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ Implemented LWG Issues: - [x] [LWG-3877](https://wg21.link/lwg3877) incorrect constraints on const-qualified monadic overloads for `std::expected` - [x] [LWG-3886](https://wg21.link/lwg3886) Monad mo' problems - [x] [LWG-4031](https://wg21.link/lwg4031) `bad_expected_access` member functions should be noexcept +- [x] [LWG-4222](https://wg21.link/lwg4222) `expected` constructor from a single value missing a constraint Enhancements: