From 8fb85cbb8d00d419bb254f2b3c9bd61be40d1225 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Sat, 17 Nov 2012 12:03:55 +0000 Subject: [PATCH] Unordered: Fix overload edge case for piecewise construction. [SVN r81393] --- include/boost/unordered/detail/extract_key.hpp | 4 ++-- test/unordered/insert_tests.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/boost/unordered/detail/extract_key.hpp b/include/boost/unordered/detail/extract_key.hpp index 969cd6ae..fd3141f0 100644 --- a/include/boost/unordered/detail/extract_key.hpp +++ b/include/boost/unordered/detail/extract_key.hpp @@ -138,7 +138,7 @@ namespace detail { #define BOOST_UNORDERED_KEY_FROM_TUPLE(namespace_) \ template \ static no_key extract(boost::unordered::piecewise_construct_t, \ - namespace_ tuple<> const&, BOOST_FWD_REF(T2)) \ + namespace_ tuple<> const&, T2 const&) \ { \ return no_key(); \ } \ @@ -146,7 +146,7 @@ namespace detail { template \ static typename is_key::type \ extract(boost::unordered::piecewise_construct_t, \ - namespace_ tuple const& k, BOOST_FWD_REF(T2)) \ + namespace_ tuple const& k, T2 const&) \ { \ return typename is_key::type( \ namespace_ get<0>(k)); \ diff --git a/test/unordered/insert_tests.cpp b/test/unordered/insert_tests.cpp index a789bf01..9fc75580 100644 --- a/test/unordered/insert_tests.cpp +++ b/test/unordered/insert_tests.cpp @@ -698,6 +698,12 @@ derived_from_piecewise_construct_t piecewise_rvalue() { return derived_from_piecewise_construct_t(); } +struct convertible_to_piecewise { + operator boost::unordered::piecewise_construct_t() const { + return boost::unordered::piecewise_construct; + } +}; + UNORDERED_AUTO_TEST(map_emplace_test2) { boost::unordered_map x; @@ -706,7 +712,7 @@ UNORDERED_AUTO_TEST(map_emplace_test2) BOOST_TEST(x.find(overloaded_constructor()) != x.end() && x.find(overloaded_constructor())->second == overloaded_constructor()); - x.emplace(boost::unordered::piecewise_construct, boost::make_tuple(1), boost::make_tuple()); + x.emplace(convertible_to_piecewise(), boost::make_tuple(1), boost::make_tuple()); BOOST_TEST(x.find(overloaded_constructor(1)) != x.end() && x.find(overloaded_constructor(1))->second == overloaded_constructor());