diff --git a/include/nlohmann/detail/conversions/from_json.hpp b/include/nlohmann/detail/conversions/from_json.hpp index 872435f9d..033bc1363 100644 --- a/include/nlohmann/detail/conversions/from_json.hpp +++ b/include/nlohmann/detail/conversions/from_json.hpp @@ -53,7 +53,8 @@ inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n) } #ifdef JSON_HAS_CPP_17 -template +template < typename BasicJsonType, typename T, + typename std::enable_if < !nlohmann::detail::is_basic_json::value, int >::type = 0 > void from_json(const BasicJsonType& j, std::optional& opt) { if (j.is_null()) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 81b22b9bd..57a90cbd4 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4889,7 +4889,8 @@ inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n) } #ifdef JSON_HAS_CPP_17 -template +template < typename BasicJsonType, typename T, + typename std::enable_if < !nlohmann::detail::is_basic_json::value, int >::type = 0 > void from_json(const BasicJsonType& j, std::optional& opt) { if (j.is_null()) diff --git a/tests/src/unit-regression2.cpp b/tests/src/unit-regression2.cpp index 7431b4e8c..39dd52378 100644 --- a/tests/src/unit-regression2.cpp +++ b/tests/src/unit-regression2.cpp @@ -1118,6 +1118,21 @@ TEST_CASE("regression tests 2") const auto decoded = json_4804::from_cbor(data); CHECK((decoded == json_4804::array())); } + + SECTION("issue #5046 - implicit conversion of return json to std::optional no longer implicit") + { + const json jval{}; + auto GetValue = [](const json & valRoot) -> std::optional + { + if (valRoot.contains("default")) + { + return valRoot.at("default"); + } + return std::nullopt; + }; + auto result = GetValue(jval); + CHECK(!result.has_value()); + } #endif }