diff --git a/include/nlohmann/detail/meta/type_traits.hpp b/include/nlohmann/detail/meta/type_traits.hpp index 6f8bf2a3d..36573bf6f 100644 --- a/include/nlohmann/detail/meta/type_traits.hpp +++ b/include/nlohmann/detail/meta/type_traits.hpp @@ -725,7 +725,7 @@ std::is_constructible ()(std::declval(), std:: // avoid their instantiation on all compilers, even when the first operand // is false. The dispatch on is_json_pointer_of can be removed once the // deprecated json_pointer comparison operators have been removed. -template::value> +template, uncvref_t>::value> struct is_comparable : std::false_type {}; template diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index f2f8a7ab4..6c98e7a8f 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4735,7 +4735,7 @@ std::is_constructible ()(std::declval(), std:: // avoid their instantiation on all compilers, even when the first operand // is false. The dispatch on is_json_pointer_of can be removed once the // deprecated json_pointer comparison operators have been removed. -template::value> +template, uncvref_t>::value> struct is_comparable : std::false_type {}; template diff --git a/tests/src/unit-json_pointer.cpp b/tests/src/unit-json_pointer.cpp index 76ae1f79b..86c636c2a 100644 --- a/tests/src/unit-json_pointer.cpp +++ b/tests/src/unit-json_pointer.cpp @@ -878,6 +878,25 @@ TEST_CASE("JSON pointers") } } + SECTION("value(json_pointer, default) with ordered_json #5664") + { + // ordered_json's transparent object comparator made value()'s + // is_comparable_with_object_key check (which passes the pointer as + // a reference) instantiate the deprecated json_pointer/string + // comparison; this must compile without relying on it. The + // deprecation warning itself is not observable here, since the + // unit test build disables -Wdeprecated-declarations (see + // cmake/clang_flags.cmake); it was checked manually instead. + const nlohmann::ordered_json j = {{"n", 1}, {"s", "text"}}; + const nlohmann::ordered_json::json_pointer ptr_n("/n"); + const nlohmann::ordered_json::json_pointer ptr_s("/s"); + const nlohmann::ordered_json::json_pointer ptr_missing("/missing"); + + CHECK(j.value(ptr_n, 0) == 1); + CHECK(j.value(ptr_s, std::string("x")) == "text"); + CHECK(j.value(ptr_missing, 42) == 42); + } + // build with C++20 // JSON_HAS_CPP_20 #if defined(__cpp_char8_t)