
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");