|
Boost Users : |
Subject: [Boost-users] [MPL] HAS_XXX gives the wrong answer after "enable_if" on incomplete type in GCC 4.6/7
From: Duncan Exon Smith (duncanphilipnorman_at_[hidden])
Date: 2012-12-18 16:14:50
I've run into an unexpected behaviour, and I'm not sure if the
compiler has a bug, if Boost.MPL has a bug, or if I have the wrong
expectations. I am using Boost v1.49.0, but I also tested r82084 of
the Boost trunk.
In particular, I have:
BOOST_MPL_HAS_XXX_TRAIT_DEF(trait)
// skipping important code here
struct traitor_1 { typedef void *trait; };
struct traitor_2 { typedef void *trait; };
static_assert(has_trait<traitor_1>::value, "traitor_1::trait is missing");
static_assert(has_trait<traitor_2>::value, "traitor_2::trait is missing");
and the compiler tells me that "has_trait<traitor_1>::value" is
"false", while "has_trait<traitor_2>::value" is "true". The above
listing skips some key code involving boost::enable_if that appears to
break "has_trait". The full listing is below.
I would appreciate if any experts could tell me if this behaviour is
expected. The complete code listing is below. I've tried:
g++-4.6 -std=gnu++0x -I/usr/include/boost-1_49 -c -o/dev/null traitor.cpp
g++-4.7 -std=gnu++0x -I/usr/include/boost-1_49 -c -o/dev/null traitor.cpp
Thanks very much,
Duncan
// traitor.cpp
# include <boost/utility/enable_if.hpp>
# include <boost/mpl/has_xxx.hpp>
BOOST_MPL_HAS_XXX_TRAIT_DEF(trait)
class C
{
struct enabler { };
public:
template <class T> C(const T &,
typename boost::enable_if<has_trait<T>,
enabler>::type = enabler());
};
struct traitor_1;
void g(const C &);
void g(const traitor_1 &);
void f(const traitor_1 &t1)
{ g(t1); }
struct traitor_1 { typedef void *trait; };
struct traitor_2 { typedef void *trait; };
static_assert(has_trait<traitor_1>::value, "traitor_1::trait is missing");
static_assert(has_trait<traitor_2>::value, "traitor_2::trait is missing");
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net