diff --git a/include/beman/optional26/optional.hpp b/include/beman/optional26/optional.hpp index a4c2c56d..cca8806c 100644 --- a/include/beman/optional26/optional.hpp +++ b/include/beman/optional26/optional.hpp @@ -197,12 +197,12 @@ struct hash>; namespace detail { template -concept enable_forward_value = std::is_constructible_v && !std::is_same_v, in_place_t> && - !std::is_same_v, std::decay_t>; +concept enable_forward_value = !std::is_same_v, optional> && + !std::is_same_v, in_place_t> && std::is_constructible_v; template concept enable_from_other = - std::is_constructible_v && !std::is_constructible_v&> && + !std::is_same_v && std::is_constructible_v && !std::is_constructible_v&> && !std::is_constructible_v&&> && !std::is_constructible_v&> && !std::is_constructible_v&&> && !std::is_convertible_v&, T> && !std::is_convertible_v&&, T> && !std::is_convertible_v&, T> && diff --git a/src/beman/optional26/tests/optional.t.cpp b/src/beman/optional26/tests/optional.t.cpp index 181d0937..1fdce093 100644 --- a/src/beman/optional26/tests/optional.t.cpp +++ b/src/beman/optional26/tests/optional.t.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -1005,3 +1006,13 @@ TEST(OptionalTest, OptionalFromOptionalConstRefExplicit) { beman::optional26::optional o5(std::move(o3)); ASSERT_TRUE(o5); } + +TEST(OptionalTest, OptionalOfAnyWorks) { + beman::optional26::optional o1 = 42; + + beman::optional26::optional o2 = o1; + EXPECT_TRUE(std::any_cast(*o2) == 42); + + beman::optional26::optional o3 = std::move(o1); + EXPECT_TRUE(std::any_cast(*o3) == 42); +}