Fix compile error with ambiguous ctor, close #11766.

When a) first elem is sequence b) second (and third) elem is(are) void*,
both of conversion ctor and forwarding ctor are candidate since SFINAE
expression has void* type.
This commit is contained in:
Kohei Takahashi
2015-12-01 01:14:52 +09:00
parent e9d489c07c
commit 12792a6c11
9 changed files with 30 additions and 22 deletions

View File

@ -21,6 +21,7 @@
// C++11 interface // C++11 interface
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/support/detail/access.hpp> #include <boost/fusion/support/detail/access.hpp>
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/container/deque/detail/keyed_element.hpp> #include <boost/fusion/container/deque/detail/keyed_element.hpp>
@ -59,7 +60,7 @@ namespace boost { namespace fusion
typename enable_if< typename enable_if<
mpl::and_< mpl::and_<
traits::is_sequence<Sequence> traits::is_sequence<Sequence>
, result_of::empty<Sequence>>>::type* /*dummy*/ = 0) BOOST_NOEXCEPT , result_of::empty<Sequence>>, void_>::type = void_()) BOOST_NOEXCEPT
{} {}
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@ -149,8 +150,8 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
explicit deque(Sequence const& seq explicit deque(Sequence const& seq
, typename disable_if<is_convertible<Sequence, Head> >::type* /*dummy*/ = 0 , typename disable_if<is_convertible<Sequence, Head>, void_>::type = void_()
, typename enable_if<traits::is_sequence<Sequence> >::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: base(base::from_iterator(fusion::begin(seq))) : base(base::from_iterator(fusion::begin(seq)))
{} {}

View File

@ -102,8 +102,8 @@ namespace boost { namespace fusion {
template<typename Sequence> template<typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
deque(Sequence const& seq deque(Sequence const& seq
, typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0 , typename disable_if<is_convertible<Sequence, T0>, void_>::type = void_()
, typename enable_if<traits::is_sequence<Sequence> >::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: base(base::from_iterator(fusion::begin(seq))) : base(base::from_iterator(fusion::begin(seq)))
{} {}
@ -133,7 +133,7 @@ FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename T0_> template <typename T0_>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
explicit deque(T0_&& t0 explicit deque(T0_&& t0
, typename enable_if<is_convertible<T0_, T0> >::type* /*dummy*/ = 0 , typename enable_if<is_convertible<T0_, T0>, void_>::type = void_()
) )
: base(BOOST_FUSION_FWD_ELEM(T0_, t0), detail::nil_keyed_element()) : base(BOOST_FUSION_FWD_ELEM(T0_, t0), detail::nil_keyed_element())
{} {}
@ -146,7 +146,8 @@ FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>&& seq deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>&& seq
, typename disable_if< , typename disable_if<
is_convertible<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>, T0> is_convertible<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>, T0>
>::type* /*dummy*/ = 0) , void_
>::type = void_())
: base(std::forward<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>>(seq)) : base(std::forward<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>>(seq))
{} {}
template <typename T> template <typename T>
@ -180,7 +181,7 @@ FUSION_HASH endif
typename enable_if< typename enable_if<
mpl::and_< mpl::and_<
traits::is_sequence<Sequence> traits::is_sequence<Sequence>
, result_of::empty<Sequence> > >::type* /*dummy*/ = 0) BOOST_NOEXCEPT , result_of::empty<Sequence> >, void_>::type = void_()) BOOST_NOEXCEPT
{} {}
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED

View File

@ -9,6 +9,7 @@
#define FUSION_CONS_07172005_0843 #define FUSION_CONS_07172005_0843
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/container/list/cons_fwd.hpp> #include <boost/fusion/container/list/cons_fwd.hpp>
#include <boost/fusion/support/detail/access.hpp> #include <boost/fusion/support/detail/access.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp> #include <boost/fusion/sequence/intrinsic/begin.hpp>
@ -34,7 +35,6 @@
namespace boost { namespace fusion namespace boost { namespace fusion
{ {
struct void_;
struct cons_tag; struct cons_tag;
struct forward_traversal_tag; struct forward_traversal_tag;
struct fusion_sequence_tag; struct fusion_sequence_tag;
@ -82,7 +82,8 @@ namespace boost { namespace fusion
traits::is_sequence<Sequence> traits::is_sequence<Sequence>
, mpl::not_<is_base_of<cons, Sequence> > , mpl::not_<is_base_of<cons, Sequence> >
, mpl::not_<is_convertible<Sequence, Car> > > // use copy to car instead , mpl::not_<is_convertible<Sequence, Car> > > // use copy to car instead
>::type* /*dummy*/ = 0 , void_
>::type = void_()
) )
: car(*fusion::begin(seq)) : car(*fusion::begin(seq))
, cdr(fusion::next(fusion::begin(seq)), mpl::true_()) {} , cdr(fusion::next(fusion::begin(seq)), mpl::true_()) {}

View File

@ -8,6 +8,7 @@
#define FUSION_LIST_07172005_1153 #define FUSION_LIST_07172005_1153
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/container/list/detail/cpp03/list_fwd.hpp> #include <boost/fusion/container/list/detail/cpp03/list_fwd.hpp>
#include <boost/fusion/container/list/detail/cpp03/list_to_cons.hpp> #include <boost/fusion/container/list/detail/cpp03/list_to_cons.hpp>
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
@ -61,7 +62,7 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
list(Sequence const& rhs list(Sequence const& rhs
, typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0) , typename boost::enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: inherited_type(rhs) {} : inherited_type(rhs) {}
// Expand a couple of forwarding constructors for arguments // Expand a couple of forwarding constructors for arguments

View File

@ -35,6 +35,7 @@
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/category_of.hpp> #include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/utility/enable_if.hpp> #include <boost/utility/enable_if.hpp>
@ -68,21 +69,21 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence const& seq map(Sequence const& seq
, typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: base_type(begin(seq), detail::map_impl_from_iterator()) : base_type(begin(seq), detail::map_impl_from_iterator())
{} {}
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence& seq map(Sequence& seq
, typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: base_type(begin(seq), detail::map_impl_from_iterator()) : base_type(begin(seq), detail::map_impl_from_iterator())
{} {}
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence&& seq map(Sequence&& seq
, typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: base_type(begin(seq), detail::map_impl_from_iterator()) : base_type(begin(seq), detail::map_impl_from_iterator())
{} {}

View File

@ -8,6 +8,7 @@
#define FUSION_SET_09162005_1104 #define FUSION_SET_09162005_1104
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/category_of.hpp> #include <boost/fusion/support/category_of.hpp>
@ -47,7 +48,6 @@
namespace boost { namespace fusion namespace boost { namespace fusion
{ {
struct void_;
struct fusion_sequence_tag; struct fusion_sequence_tag;
template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_SET_SIZE, typename T)> template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_SET_SIZE, typename T)>
@ -72,7 +72,7 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
set(Sequence const& rhs set(Sequence const& rhs
, typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0) , typename boost::enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: data(rhs) {} : data(rhs) {}
#include <boost/fusion/container/set/detail/cpp03/set_forward_ctor.hpp> #include <boost/fusion/container/set/detail/cpp03/set_forward_ctor.hpp>

View File

@ -21,6 +21,7 @@
// C++11 interface // C++11 interface
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#include <boost/fusion/support/detail/access.hpp> #include <boost/fusion/support/detail/access.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/category_of.hpp> #include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
@ -60,8 +61,8 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
set(Sequence const& rhs, set(Sequence const& rhs,
typename enable_if<traits::is_sequence<Sequence> >::type* = 0, typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_(),
typename enable_if<detail::is_same_size<Sequence, storage_type> >::type* = 0) typename enable_if<detail::is_same_size<Sequence, storage_type>, void_>::type = void_())
: data(rhs) {} : data(rhs) {}
template <typename T> template <typename T>
@ -102,8 +103,8 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
set(Sequence&& rhs, set(Sequence&& rhs,
typename enable_if<traits::is_sequence<Sequence> >::type* = 0, typename enable_if<traits::is_sequence<Sequence>, void_>::type = void_(),
typename enable_if<detail::is_same_size<Sequence, storage_type> >::type* = 0) typename enable_if<detail::is_same_size<Sequence, storage_type>, void_>::type = void_())
: data(std::forward<Sequence>(rhs)) {} : data(std::forward<Sequence>(rhs)) {}
template <typename ...U> template <typename ...U>

View File

@ -11,6 +11,7 @@
#include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_binary_params.hpp> #include <boost/preprocessor/repetition/enum_binary_params.hpp>
#include <boost/fusion/support/config.hpp> #include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/container/vector/vector_fwd.hpp> #include <boost/fusion/container/vector/vector_fwd.hpp>
#include <boost/fusion/container/vector/detail/cpp03/vector_n_chooser.hpp> #include <boost/fusion/container/vector/detail/cpp03/vector_n_chooser.hpp>
@ -118,7 +119,7 @@ namespace boost { namespace fusion
template <typename Sequence> template <typename Sequence>
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
vector(Sequence const& rhs, vector(Sequence const& rhs,
typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0) typename boost::enable_if<traits::is_sequence<Sequence>, void_>::type = void_())
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {} : vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
// Expand a couple of forwarding constructors for arguments // Expand a couple of forwarding constructors for arguments

View File

@ -24,6 +24,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#include <boost/fusion/support/sequence_base.hpp> #include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/is_sequence.hpp> #include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/support/void.hpp>
#include <boost/fusion/support/detail/index_sequence.hpp> #include <boost/fusion/support/detail/index_sequence.hpp>
#include <boost/fusion/container/vector/detail/at_impl.hpp> #include <boost/fusion/container/vector/detail/at_impl.hpp>
#include <boost/fusion/container/vector/detail/value_at_impl.hpp> #include <boost/fusion/container/vector/detail/value_at_impl.hpp>
@ -164,7 +165,7 @@ namespace boost { namespace fusion
template <typename U> template <typename U>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
store(U&& rhs store(U&& rhs
, typename disable_if<is_same<typename pure<U>::type, store> >::type* = 0) , typename disable_if<is_same<typename pure<U>::type, store>, void_>::type = void_())
: elem(std::forward<U>(rhs)) : elem(std::forward<U>(rhs))
{} {}