Fix for fusion pair to make the compiler select the proper copy

constructor and remove a viable, but wrong, constructor. test added.
This commit is contained in:
Joel de Guzman
2014-11-15 09:35:50 +08:00
parent a4660f41af
commit f3fa7a1dc6
2 changed files with 23 additions and 1 deletions

View File

@ -37,9 +37,11 @@ namespace boost { namespace fusion
: second(rhs.second) {} : second(rhs.second) {}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
pair(pair&& rhs) pair(pair&& rhs)
: second(std::forward<Second>(rhs.second)) {} : second(std::forward<Second>(rhs.second)) {}
#endif #endif
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
@ -50,7 +52,7 @@ namespace boost { namespace fusion
template <typename Second2> template <typename Second2>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
pair(Second2&& val explicit pair(Second2&& val
, typename boost::enable_if<is_convertible<Second2, Second> >::type* /*dummy*/ = 0 , typename boost::enable_if<is_convertible<Second2, Second> >::type* /*dummy*/ = 0
) : second(std::forward<Second2>(val)) {} ) : second(std::forward<Second2>(val)) {}

View File

@ -25,6 +25,19 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
struct copy_all
{
copy_all() {}
copy_all(copy_all const&) {}
template <typename T>
copy_all(T const& x)
{
foo(x); // should fail!
}
};
int int
main() main()
{ {
@ -119,6 +132,13 @@ main()
BOOST_TEST(at_key<char>(make_map<char, int>('X', 123)) == 'X'); BOOST_TEST(at_key<char>(make_map<char, int>('X', 123)) == 'X');
BOOST_TEST(at_key<int>(make_map<char, int>('X', 123)) == 123); BOOST_TEST(at_key<int>(make_map<char, int>('X', 123)) == 123);
} }
{
// test for copy construction of fusion pairs
// make sure that the correct constructor is called
pair<int, copy_all> p1;
pair<int, copy_all> p2 = p1;
}
return boost::report_errors(); return boost::report_errors();
} }