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

时间:2013-01-21 18:05:29

标签: c++ multithreading rvalue-reference visual-c++-2012 stdthread

我在MSVC 2012中遇到了rvalue引用问题。

#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
}

编译器说:错误C2664:'void(std :: promise&lt; _Ty&gt;&amp;&amp;)':无法从'std :: promise&lt; _Ty&gt;'转换参数1到'std :: promise&lt; _Ty&gt; &安培;&安培;'

我的错误(然后是如何解决)或编译器问题(然后我想知道这种行为的起源)?

1 个答案:

答案 0 :(得分:3)

这是std::thread的Visual C ++ 2012实现中的已知问题。请参阅Microsoft Connect上的以下错误:

  

std::thread constructor doesn't handle movable object

对该错误的回应指出:

  

我们试图在VC11的开发过程中解决这个问题,但它爆炸性地爆炸,我们不得不恢复变化。事实证明,std :: thread不能由bind()提供支持,因为线程需要移动它的参数,并禁止bind()这样做(因为绑定的仿函数应该可以重复调用,没有他们的约束参数被移动了。因此,我们需要重新实现std::thread的ctor以避免使用bind()