Multithreading 为什么这不是编译?(右值作为线程参数)

Multithreading 为什么这不是编译?(右值作为线程参数),multithreading,c++11,move,promise,future,Multithreading,C++11,Move,Promise,Future,您好,这是我在MSVC12上编写的测试代码 有人能告诉我为什么在我向线程传递参数时std::move没有将变量转换为右值引用吗?? 我该怎么做 谢谢大家! ///some arbitrary long task std::string DumpFile(std::string path){ std::this_thread::sleep_for(std::chrono::seconds(10)); return path; } void run_promise(std::promis

您好,这是我在MSVC12上编写的测试代码

有人能告诉我为什么在我向线程传递参数时std::move没有将变量转换为右值引用吗?? 我该怎么做

谢谢大家!

///some arbitrary long task
std::string DumpFile(std::string path){
  std::this_thread::sleep_for(std::chrono::seconds(10));
  return path;
}


void run_promise(std::promise<std::string> &&_prom, std::string &&_path){
  try {
    std::string val = DumpFile(std::move(_path));
    _prom.set_value(val);
  }
  catch (...) {
    _prom.set_exception(std::current_exception());
  }
}

std::future<std::string> ADumpFile(std::string && path) {
  std::promise<std::string> prms;
  std::future<std::string> fut = prms.get_future();
  std::thread th(run_promise, std::move(prms), std::move(path));
  th.detach();
  return fut;
}

int main(int argc, char* argv []){
  auto fut = ADumpFile("toto");
  while (fut.wait_for(std::chrono::seconds(1))!=std::future_status::ready){
    std::cout << "waiting\n";
  }
  auto res = fut.get();
  getchar();
  return 0;
}
我得到的错误是:

错误1错误C2664:“void std::promise&&,std::string&&”:无法将参数2从“std::basic_string”转换为“std::string&&”C:\Program Files x86\Microsoft Visual Studio 12.0\VC\include\functional 1149 1 demo11 错误2错误C2664:“void std::promise&&,std::string&&”:无法将参数1从“std::promise”转换为“std::promise&&”C:\Program Files x86\Microsoft Visual Studio 12.0\VC\include\functional 1149 1 demo11

尽管如此,如果我调用run_promisestd::moveprom,std::movepath,我没有问题


这是一个与通过线程CTOR传递右值参数有关的问题吗?

这个问题是针对VC11报告的,似乎MS没有在VC12中解决。

您有一个按值接受std::promise的函数。这是行不通的,因为std::promise无法复制。是的,您已将prms移动到线程中,但线程不知道如何进一步将其实例移动到run_promise中。好的,我也尝试过这样做,如果通过&&,我添加了错误代码。我开始想知道我是否可以将右值作为线程的参数传递给CTOR,线程参数是否按照应该的方式转发给函数cal?这是一个bug?我跟随了当前打开的票证的链接:该票证已在visual 2015 RTM中关闭。