1

我在 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
}

编译器说:错误 C2664: 'void (std::promise<_Ty> &&)' : 无法将参数 1 从 'std::promise<_Ty>' 转换为 'std::promise<_Ty> &&'

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

4

1 回答 1

3

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

std::thread 构造函数不处理可移动对象

对该错误的响应指出:

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

于 2013-01-21T19:03:57.757 回答