🚑 fix regression from #2181

parent d019ddfc
...@@ -3785,7 +3785,7 @@ class basic_json ...@@ -3785,7 +3785,7 @@ class basic_json
template<class ValueType, typename std::enable_if< template<class ValueType, typename std::enable_if<
std::is_convertible<basic_json_t, ValueType>::value std::is_convertible<basic_json_t, ValueType>::value
and not std::is_same<value_t, ValueType>::value, int>::type = 0> and not std::is_same<value_t, ValueType>::value, int>::type = 0>
ValueType value(const typename object_t::key_type& key, ValueType && default_value) const ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const
{ {
// at only works for objects // at only works for objects
if (JSON_HEDLEY_LIKELY(is_object())) if (JSON_HEDLEY_LIKELY(is_object()))
...@@ -3797,7 +3797,7 @@ class basic_json ...@@ -3797,7 +3797,7 @@ class basic_json
return *it; return *it;
} }
return std::move(default_value); return default_value;
} }
JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()))); JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name())));
...@@ -3809,7 +3809,7 @@ class basic_json ...@@ -3809,7 +3809,7 @@ class basic_json
*/ */
string_t value(const typename object_t::key_type& key, const char* default_value) const string_t value(const typename object_t::key_type& key, const char* default_value) const
{ {
return value(key, std::move(string_t(default_value))); return value(key, string_t(default_value));
} }
/*! /*!
...@@ -3857,7 +3857,7 @@ class basic_json ...@@ -3857,7 +3857,7 @@ class basic_json
*/ */
template<class ValueType, typename std::enable_if< template<class ValueType, typename std::enable_if<
std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0> std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0>
ValueType value(const json_pointer& ptr, ValueType && default_value) const ValueType value(const json_pointer& ptr, const ValueType& default_value) const
{ {
// at only works for objects // at only works for objects
if (JSON_HEDLEY_LIKELY(is_object())) if (JSON_HEDLEY_LIKELY(is_object()))
...@@ -3869,7 +3869,7 @@ class basic_json ...@@ -3869,7 +3869,7 @@ class basic_json
} }
JSON_INTERNAL_CATCH (out_of_range&) JSON_INTERNAL_CATCH (out_of_range&)
{ {
return std::move(default_value); return default_value;
} }
} }
...@@ -3883,7 +3883,7 @@ class basic_json ...@@ -3883,7 +3883,7 @@ class basic_json
JSON_HEDLEY_NON_NULL(3) JSON_HEDLEY_NON_NULL(3)
string_t value(const json_pointer& ptr, const char* default_value) const string_t value(const json_pointer& ptr, const char* default_value) const
{ {
return value(ptr, std::move(string_t(default_value))); return value(ptr, string_t(default_value));
} }
/*! /*!
......
...@@ -19715,7 +19715,7 @@ class basic_json ...@@ -19715,7 +19715,7 @@ class basic_json
template<class ValueType, typename std::enable_if< template<class ValueType, typename std::enable_if<
std::is_convertible<basic_json_t, ValueType>::value std::is_convertible<basic_json_t, ValueType>::value
and not std::is_same<value_t, ValueType>::value, int>::type = 0> and not std::is_same<value_t, ValueType>::value, int>::type = 0>
ValueType value(const typename object_t::key_type& key, ValueType && default_value) const ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const
{ {
// at only works for objects // at only works for objects
if (JSON_HEDLEY_LIKELY(is_object())) if (JSON_HEDLEY_LIKELY(is_object()))
...@@ -19727,7 +19727,7 @@ class basic_json ...@@ -19727,7 +19727,7 @@ class basic_json
return *it; return *it;
} }
return std::move(default_value); return default_value;
} }
JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()))); JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name())));
...@@ -19739,7 +19739,7 @@ class basic_json ...@@ -19739,7 +19739,7 @@ class basic_json
*/ */
string_t value(const typename object_t::key_type& key, const char* default_value) const string_t value(const typename object_t::key_type& key, const char* default_value) const
{ {
return value(key, std::move(string_t(default_value))); return value(key, string_t(default_value));
} }
/*! /*!
...@@ -19787,7 +19787,7 @@ class basic_json ...@@ -19787,7 +19787,7 @@ class basic_json
*/ */
template<class ValueType, typename std::enable_if< template<class ValueType, typename std::enable_if<
std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0> std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0>
ValueType value(const json_pointer& ptr, ValueType && default_value) const ValueType value(const json_pointer& ptr, const ValueType& default_value) const
{ {
// at only works for objects // at only works for objects
if (JSON_HEDLEY_LIKELY(is_object())) if (JSON_HEDLEY_LIKELY(is_object()))
...@@ -19799,7 +19799,7 @@ class basic_json ...@@ -19799,7 +19799,7 @@ class basic_json
} }
JSON_INTERNAL_CATCH (out_of_range&) JSON_INTERNAL_CATCH (out_of_range&)
{ {
return std::move(default_value); return default_value;
} }
} }
...@@ -19813,7 +19813,7 @@ class basic_json ...@@ -19813,7 +19813,7 @@ class basic_json
JSON_HEDLEY_NON_NULL(3) JSON_HEDLEY_NON_NULL(3)
string_t value(const json_pointer& ptr, const char* default_value) const string_t value(const json_pointer& ptr, const char* default_value) const
{ {
return value(ptr, std::move(string_t(default_value))); return value(ptr, string_t(default_value));
} }
/*! /*!
......
...@@ -1945,6 +1945,15 @@ TEST_CASE("regression tests") ...@@ -1945,6 +1945,15 @@ TEST_CASE("regression tests")
) )
); );
} }
SECTION("PR #2181 - regression bug with lvalue")
{
// see https://github.com/nlohmann/json/pull/2181#issuecomment-653326060
json j{{"x", "test"}};
std::string defval = "default value";
auto val = j.value("x", defval);
auto val2 = j.value("y", defval);
}
} }
#if not defined(JSON_NOEXCEPTION) #if not defined(JSON_NOEXCEPTION)
......
...@@ -60,9 +60,9 @@ class person_with_private_data ...@@ -60,9 +60,9 @@ class person_with_private_data
class person_without_private_data_1 class person_without_private_data_1
{ {
public: public:
std::string name = ""; std::string name = "";
int age = 0; int age = 0;
json metadata = nullptr; json metadata = nullptr;
bool operator==(const person_without_private_data_1& rhs) const bool operator==(const person_without_private_data_1& rhs) const
{ {
...@@ -82,9 +82,9 @@ class person_without_private_data_1 ...@@ -82,9 +82,9 @@ class person_without_private_data_1
class person_without_private_data_2 class person_without_private_data_2
{ {
public: public:
std::string name = ""; std::string name = "";
int age = 0; int age = 0;
json metadata = nullptr; json metadata = nullptr;
bool operator==(const person_without_private_data_2& rhs) const bool operator==(const person_without_private_data_2& rhs) const
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment