将打包的任务推入容器会导致VS2013中的C2280错误

rti*_*277 1 c++ concurrent.futures

我想使用packaged_tasks将任务添加到容器中。我创建一个任务,将其绑定到一个数字,然后尝试将其放入双端队列。我在push_back上收到编译器错误C2280(VS2013)。这是代码:

void DoTask( int i )
{
  std::cout << "int value: " << i << std::endl;
}

std::deque< std::packaged_task< void() > > task_q;

int _tmain(int argc, _TCHAR* argv[])
{
  std::packaged_task< void() > t( std::bind( DoTask, 3 ) );
  task_q.push_back( t ); // <-- C2280 error

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是从YouTube博前的讲座“ C ++线程#9:packaged_task”中获得此示例代码的。这是一些错误代码文本:“错误C2280:'std :: packaged_task :: packaged_task(const std :: packaged_task&)':尝试引用已删除的函数...请参见'std :: packaged_task :: packaged_task'的声明...同时编译类模板成员函数'void std :: allocator <_Ty> :: construct(_Ty *,const _Ty&)'1> with 1> [1> _Ty = std :: packaged_task“

这是经过两次更正的代码(移动任务和非无效返回值):

int DoTask( int i ) // non-void return value
{
  return i;
}

std::deque< std::packaged_task< int() > > task_q; // bind eliminates need for arg (Bo Qian lecture)

int _tmain( int argc, _TCHAR* argv[] )
{
  std::packaged_task< int() > t( std::bind( DoTask, 3 ) ); // bind eliminates need for arg
  task_q.push_back( std::move( t ) ); // <-- move not copy

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 5

的复制构造函数packaged_task已删除。使用:

task_q.push_back( std::move(t) );
Run Code Online (Sandbox Code Playgroud)