
Le 06/11/12 09:53, John Maddock a écrit :
I don't know if this is a regression on Boost.TypeTraits or if I'm using incorrectly the is_function trait.
Ideally it shouldn't be possible to use it incorrectly, which isn't to say that there aren't corner cases...
John, could you confirm there is a bug in is_function?
If the failure is specific to one test runner, then I suspect a compiler bug: do you have a reduced test case I can look at?
Hi, I don't reach to isolate the error. The following compiles as expected :( Best, Vicente #define BOOST_THREAD_VERSION 4 #include <boost/thread/future.hpp> #include <boost/static_assert.hpp> BOOST_STATIC_ASSERT(boost::is_function<int&>::value == false); BOOST_STATIC_ASSERT(( boost::is_function<boost::packaged_task<int()> &>::value == false )); BOOST_STATIC_ASSERT(( boost::is_function<boost::rv<boost::packaged_task<int()> >&>::value == false )); BOOST_STATIC_ASSERT(( boost::is_function<boost::rv<boost::rv<boost::packaged_task<int()> >
&>::value == false )); BOOST_STATIC_ASSERT(( boost::is_convertible< boost::rv<boost::packaged_task<int()> >&, boost::rv<boost::rv<boost::packaged_task<int()> > >& >::value == false )); BOOST_STATIC_ASSERT(( boost::detail::is_convertible_impl< boost::rv<boost::packaged_task<int()> >&, boost::rv<boost::rv<boost::packaged_task<int()> > >& >::value == false ));
int h() { return 0; } struct dummy1; template <class F> int apply(F f, typename boost::disable_if_c< boost::is_convertible<F&,BOOST_THREAD_RV_REF(F)>::value, dummy1* >::type=0) { return f(); } template <class R> boost::future<R> my_async(R(*f)()) { boost::packaged_task<R()> pt( f ); boost::future<R> ret = pt.get_future(); boost::thread( boost::move(pt) ).detach(); return boost::move(ret); } int g() { return apply(h) + my_async(h).get(); }