diff --git a/include/msgpack/adaptor/cpp11/reference_wrapper.hpp b/include/msgpack/adaptor/cpp11/reference_wrapper.hpp index 214a6a7f..59974e67 100644 --- a/include/msgpack/adaptor/cpp11/reference_wrapper.hpp +++ b/include/msgpack/adaptor/cpp11/reference_wrapper.hpp @@ -24,6 +24,7 @@ #include "msgpack/adaptor/check_container_size.hpp" #include +#include namespace msgpack { @@ -53,14 +54,14 @@ struct pack> { template struct object > { void operator()(msgpack::object& o, const std::reference_wrapper& v) const { - msgpack::adaptor::object()(o, v.get()); + msgpack::adaptor::object::type>()(o, v.get()); } }; template struct object_with_zone> { void operator()(msgpack::object::with_zone& o, const std::reference_wrapper& v) const { - msgpack::adaptor::object_with_zone()(o, v.get()); + msgpack::adaptor::object_with_zone::type>()(o, v.get()); } }; diff --git a/test/reference_wrapper_cpp11.cpp b/test/reference_wrapper_cpp11.cpp index b1ed8876..6550af37 100644 --- a/test/reference_wrapper_cpp11.cpp +++ b/test/reference_wrapper_cpp11.cpp @@ -17,7 +17,20 @@ TEST(MSGPACK_REFERENCE_WRAPPER, pack_convert) msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size()); int i2 = 0; std::reference_wrapper val2(i2); - oh.get().convert(val2);; + oh.get().convert(val2); + EXPECT_EQ(i1, i2); +} + +TEST(MSGPACK_REFERENCE_WRAPPER, pack_convert_const) +{ + const int i1 = 42; + std::reference_wrapper val1(i1); + std::stringstream ss; + msgpack::pack(ss, val1); + msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size()); + int i2 = 0; + std::reference_wrapper val2(i2); + oh.get().convert(val2); EXPECT_EQ(i1, i2); } @@ -44,6 +57,17 @@ TEST(MSGPACK_REFERENCE_WRAPPER, object) EXPECT_EQ(i1, i2); } +TEST(MSGPACK_REFERENCE_WRAPPER, object_const) +{ + const int i1 = 42; + std::reference_wrapper val1(i1); + msgpack::object o(val1); + int i2 = 0; + std::reference_wrapper val2(i2); + o.convert(val2); + EXPECT_EQ(i1, i2); +} + TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone) { std::string s1 = "ABC"; @@ -56,4 +80,16 @@ TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone) EXPECT_EQ(s1, s2); } +TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone_const) +{ + const std::string s1 = "ABC"; + std::reference_wrapper val1(s1); + msgpack::zone z; + msgpack::object o(val1, z); + std::string s2 = "DE"; + std::reference_wrapper val2(s2); + o.convert(val2); + EXPECT_EQ(s1, s2); +} + #endif // !defined(MSGPACK_USE_CPP03)