------- Comment #5 from redi at gcc dot gnu dot org 2010-04-28 11:15 ------- I think this error is correct:
./boost/thread/pthread/thread_heap_alloc.hpp: In function 'T* boost::detail::heap_new(A1&&) [with T = boost::detail::thread_data<void (*)()>, A1 = void (*&)()]': ./boost/thread/detail/thread.hpp:130:95: instantiated from here ./boost/thread/pthread/thread_heap_alloc.hpp:24:47: error: cannot bind 'void (*)()' lvalue to 'void (*&&)()' ./boost/thread/detail/thread.hpp:43:13: error: initializing argument 1 of 'boost::detail::thread_data<F>::thread_data(F&&) [with F = void (*)()]' A1 is deduced as an lvalue-reference, so reference-collapsing means that static_cast<A1&&> is a cast to an lvalue-reference, which won't bind to the rvalue-reference parameter. And I also think this error is correct: ./boost/thread/detail/thread.hpp: In function 'boost::thread&& boost::move(boost::thread&&)': ./boost/thread/detail/thread.hpp:349:16: error: invalid initialization of reference of type 'boost::thread&&' from expression of type 'boost::thread' Although the diagnostic is misleading. The code is: inline thread&& move(thread&& t) { return t; } At the point of return 't' is an lvalue so to return it as an rvalue it needs to be static_cast<thread&&>(t) I think this is INVALID -- redi at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |redi at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43915