C++ std::thread构造函数中的可移动参数(Visual C+;+;2012)

C++ std::thread构造函数中的可移动参数(Visual C+;+;2012),c++,multithreading,rvalue-reference,visual-c++-2012,stdthread,C++,Multithreading,Rvalue Reference,Visual C++ 2012,Stdthread,我在MSVC 2012中遇到了右值引用的问题 #include <thread> #include <string> #include <future> void foo(std::promise<std::string> &&prms) { /* some code */ } int main() { std::promise<std::string> prms; // std::future<std

我在MSVC 2012中遇到了右值引用的问题

#include <thread>
#include <string>
#include <future>

void foo(std::promise<std::string> &&prms) { /* some code */ }

int main() {
  std::promise<std::string> prms;
  // std::future<std::string> ftr = prms.get_future();
  std::thread th(&foo, std::move(prms));

  // some other code
}
#包括
#包括
#包括
voidfoo(std::promise&&prms){/*一些代码*/}
int main(){
std::promise-prms;
//std::future ftr=prms.get_future();
std::thread th(&foo,std::move(prms));
//其他代码
}
编译器说:错误C2664:“void(std::promise&&)”:无法将参数1从“std::promise”转换为“std::promise&&”


是否存在我的错误(如何修复它)或编译器问题(然后我想知道这种行为的起源)?

< P>这是VisualC++ 2012实现的一个已知问题:<代码> STD::线程< /代码>。请参阅Microsoft Connect上的以下错误:

对该错误的响应表明:

我们试图在VC11的开发过程中解决这个问题,但它发生了可怕的爆炸,我们不得不恢复更改。事实证明,
bind()
不能为std::thread提供动力,因为线程需要移动其参数,
bind()
被禁止这样做(因为绑定函子应该可以重复调用,而不会移动其绑定参数)。因此,我们需要重新实现
std::thread
的构造函数,以避免使用
bind()


@实际上,这是Bartocz Milewski的代码示例。看一看(未来部分)。我想知道,为什么我不能编译它。我想知道为什么巴托茨试图改变这一承诺。@LightnessRacesinOrbit-我可以猜,这是一种摆脱超出范围问题的方法。如果左值引用
promise
@Loom:这不会破坏未来?@Loom:Hmm。。好吧,巴托斯的
asyncFun
以价值观接受了承诺。试试看。虽然您是对的,但这仅在线程是从右值引用构造的情况下才有效,因此您的原始函数和右值引用也应该有效。