Le 21/05/13 08:24, Vicente J. Botet Escriba a écrit :
Hi,
There is a severe bug in packaged_task constructor when compiling in
C++11 mode and giving a copyable functor as parameter, as reported in
https://svn.boost.org/trac/boost/ticket/8596. I believe that this is
not a regression, this have never worked.
Until I find a fix, the packaged_task could be used only with free
functions and with movable functors when compiling in C++11 mode.
I think that i have found why this was not working an fix it. The
forwarding from packaged task to the internal class was incorrect.
The following patch fix the example in ticket and works for all the
ts_packaged_task regression tests.
I'll commit this on trunk once the whole regression tests finish and pass.
Best,
Vicente
svn diff detail/config.hpp future.hpp
Index: detail/config.hpp
===================================================================
--- detail/config.hpp (revision 84336)
+++ detail/config.hpp (working copy)
@@ -13,8 +13,6 @@
#include
//#define BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS
-
-
// ATTRIBUTE_MAY_ALIAS
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) > 302 \
@@ -95,9 +93,9 @@
#endif
/// RVALUE_REFERENCES_DONT_MATCH_FUNTION_PTR
-#if defined BOOST_NO_CXX11_RVALUE_REFERENCES || defined BOOST_MSVC
+//#if defined BOOST_NO_CXX11_RVALUE_REFERENCES || defined BOOST_MSVC
#define BOOST_THREAD_RVALUE_REFERENCES_DONT_MATCH_FUNTION_PTR
-#endif
+//#endif
// Default version
#if !defined BOOST_THREAD_VERSION
Index: future.hpp
===================================================================
--- future.hpp (revision 84336)
+++ future.hpp (working copy)
@@ -2275,18 +2275,12 @@
task_object(task_object&);
public:
F f;
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- task_object(BOOST_THREAD_RV_REF(F) f_):
- f(boost::forward<F>(f_))
- {}
-#else
task_object(F const& f_):
f(f_)
{}
task_object(BOOST_THREAD_RV_REF(F) f_):
- f(boost::move(f_)) // TODO forward
+ f(boost::move(f_))
{}
-#endif
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK &&
defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
void do_apply(BOOST_THREAD_RV_REF(ArgTypes) ... args)
@@ -2837,12 +2831,11 @@
#endif
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
template <class F>
- explicit packaged_task(BOOST_THREAD_RV_REF(F) f
+ explicit packaged_task(BOOST_THREAD_FWD_REF(F) f
, typename disable_if, dummy* >::type=0
)
{
- //typedef typename remove_cv::type FR;
- typedef F FR;
+ typedef typename remove_cv::type FR;
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
#if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
typedef detail::task_object
task_object_type;
@@ -2921,10 +2914,9 @@
#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
template
- packaged_task(boost::allocator_arg_t, Allocator a,
BOOST_THREAD_RV_REF(F) f)
+ packaged_task(boost::allocator_arg_t, Allocator a,
BOOST_THREAD_FWD_REF(F) f)
{
- //typedef typename remove_cv::type FR;
- typedef F FR;
+ typedef typename remove_cv::type FR;
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
#if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
typedef detail::task_object task_object_type;
iMac-de-Vicente-Botet-Escriba:thread viboes$