std :: packaged_task编译错误w/gcc 4.6

mt_*_*mt_ 5 c++ concurrency g++ std c++11

我正在尝试使用一个线程启动一个函数 std::packaged_task

Query query; /* protobuf object */        

/* fill Query object */

std::packaged_task<SearchResults(Query&)> task([](Query& q) ->SearchResults {
    index::core::Merger merger;
    return merger.search(q);
    });

std::future<SearchResults> ftr = task.get_future();
std::thread(std::move(task),query).detach();
Run Code Online (Sandbox Code Playgroud)

Edit2:再次更新代码以修复错误并包含完整的错误消息.

g ++ - 4.6(在Ubuntu 10.04上)无法编译代码:

In file included from /usr/include/c++/4.6/memory:80:0,
              from ../src/net/QueryConnection.cpp:8:
/usr/include/c++/4.6/functional: In instantiation of ‘std::_Bind_result<void, 
std::packaged_task<SearchResults(Query&)>(Query)>’:
/usr/include/c++/4.6/thread:135:9:   instantiated from ‘std::thread::thread(_Callable&&, 
_Args&& ...) [with _Callable = std::packaged_task<SearchResults(Query&)>, _Args = 
{Query&}]’
../src/net/QueryConnection.cpp:77:36:   instantiated from here
/usr/include/c++/4.6/functional:1365:7: error: ‘std::_Bind_result<_Result, 
_Functor(_Bound_args ...)>::_Bind_result(const std::_Bind_result<_Result, 
_Functor(_Bound_args ...)>&) [with _Result = void, _Functor =   
std::packaged_task<SearchResults(Query&)>, _Bound_args = {Query}, 
std::_Bind_result<_Result, _Functor(_Bound_args ...)> = std::_Bind_result<void, 
std::packaged_task<SearchResults(Query&)>(Query)>]’ declared to take const reference, 
but implicit declaration would take non-const
Build error occurred, build is stopped
Run Code Online (Sandbox Code Playgroud)

我读过这可能是由于一个错误:gcc-mailinglist

我是C++/C++ 11的新手 - 什么是一个好的工作替代品?我只需要启动一个给我未来的线程,get()后者在boost::asio异步循环中调用-method .

Jon*_*ely 3

这是 GCC 4.6 中的一个错误(实际上是 C++11 标准中的一个缺陷),我已经在 4.7 中修复了该错误。

作为解决方法,您可以使用std::async

Query query;
std::future<SearchResults> ftr = std::async([](Query& q) ->SearchResults {
      index::core::Merger merger;
      return merger.search(q);
    }, query);
Run Code Online (Sandbox Code Playgroud)

这适用于 GCC 4.6,并且比创建packaged_task并在独立线程中运行它更简单、更安全。