From db5c24e0e77ab1b2b21b6e9843aced7abd9c5c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Wed, 24 Aug 2016 01:52:53 +0200 Subject: [PATCH] Fix piecewise_construct pair constructor for compilers with variadics and constructor forwarding. Current code unconditionally moves instead of forwarding. --- include/boost/container/detail/pair.hpp | 8 ++++---- .../detail/variadic_templates_tools.hpp | 16 ++++++++-------- test/pair_test.cpp | 13 +++++++++++++ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/include/boost/container/detail/pair.hpp b/include/boost/container/detail/pair.hpp index 0bf39f7..101ba72 100644 --- a/include/boost/container/detail/pair.hpp +++ b/include/boost/container/detail/pair.hpp @@ -214,10 +214,10 @@ struct pair #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) # if !defined(BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS) private: - template - pair(Tuple1& t1, Tuple2& t2, index_tuple, index_tuple) - : first (get(::boost::move(t1))...) - , second(get(::boost::move(t2))...) + template class Tuple, class... Args1, class... Args2, size_t... Indexes1, size_t... Indexes2> + pair(Tuple& t1, Tuple& t2, index_tuple, index_tuple) + : first (::boost::forward(get(t1))...) + , second(::boost::forward(get(t2))...) { (void) t1; (void)t2; } public: diff --git a/include/boost/container/detail/variadic_templates_tools.hpp b/include/boost/container/detail/variadic_templates_tools.hpp index f9b022f..7bf3b25 100644 --- a/include/boost/container/detail/variadic_templates_tools.hpp +++ b/include/boost/container/detail/variadic_templates_tools.hpp @@ -42,13 +42,13 @@ class tuple typedef tuple inherited; public: - tuple() { } + tuple() + : inherited(), m_head() + {} - // implicit copy-constructor is okay - // Construct tuple from separate arguments. - tuple(typename add_const_reference::type v, - typename add_const_reference::type... vtail) - : inherited(vtail...), m_head(v) + template + tuple(U &&u, Args && ...args) + : inherited(::boost::forward(args)...), m_head(::boost::forward(u)) {} // Construct tuple from another tuple. @@ -77,8 +77,8 @@ class tuple template -tuple tie_forward(Values&&... values) -{ return tuple(values...); } +tuple forward_as_tuple(Values&&... values) +{ return tuple(::boost::forward(values)...); } template struct tuple_element; diff --git a/test/pair_test.cpp b/test/pair_test.cpp index a3f10ec..a8f4b0a 100644 --- a/test/pair_test.cpp +++ b/test/pair_test.cpp @@ -135,6 +135,19 @@ int main () BOOST_TEST(std::get<2>(p.first) == 32.); BOOST_TEST(p.second == 'b'); } + #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + typedef container_detail::pair movable_pair_t; + typedef container_detail::pair movable_pair_pair_t; + test::movable_int a(1), b(2), c(3), d(4); + movable_pair_pair_t p( piecewise_construct + , container_detail::forward_as_tuple(boost::move(a), boost::move(b)) + , container_detail::forward_as_tuple(boost::move(c), boost::move(d)) + ); + BOOST_TEST(p.first.first == 1); + BOOST_TEST(p.first.second == 2); + BOOST_TEST(p.second.first == 3); + BOOST_TEST(p.second.second == 4); + #endif } #endif //#!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_HDR_TUPLE) return ::boost::report_errors();