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::value, "traitor_1::trait is missing");
static_assert(has_trait::value, "traitor_2::trait is missing");
and the compiler tells me that "has_trait::value" is
"false", while "has_trait::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
# include
BOOST_MPL_HAS_XXX_TRAIT_DEF(trait)
class C
{
struct enabler { };
public:
template <class T> C(const T &,
typename boost::enable_if::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::value, "traitor_1::trait is missing");
static_assert(has_trait::value, "traitor_2::trait is missing");