diff --git a/include/boost/json/impl/object.hpp b/include/boost/json/impl/object.hpp index 976c334b7..9580a81c2 100644 --- a/include/boost/json/impl/object.hpp +++ b/include/boost/json/impl/object.hpp @@ -398,7 +398,7 @@ insert_or_assign( key, key, static_cast(m) ); if( !result.second ) { - value(static_cast(m), sp_).swap( + value(static_cast(m), sp_).swap( result.first->value()); } return result; diff --git a/test/object.cpp b/test/object.cpp index 17b2a752f..efd88cae0 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -1201,6 +1201,17 @@ class object_test { "k3", 3 }, { "k4", 2 }})); } + + // rvalue is moved, not copied, on the assign branch + { + object o = { + { "k1", 1 }, + { "k2", { 1, 2, 3 } } }; + value v = { 4, 5, 6 }; + auto const d = v.as_array().data(); + o.insert_or_assign("k2", std::move(v)); + BOOST_TEST(o.at("k2").as_array().data() == d); + } } // emplace(key, arg)