我在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; &安培;&安培;'的
我的错误(然后是如何解决)或编译器问题(然后我想知道这种行为的起源)?
答案 0 :(得分:3)
这是std::thread
的Visual C ++ 2012实现中的已知问题。请参阅Microsoft Connect上的以下错误:
对该错误的回应指出:
我们试图在VC11的开发过程中解决这个问题,但它爆炸性地爆炸,我们不得不恢复变化。事实证明,std :: thread不能由
bind()
提供支持,因为线程需要移动它的参数,并禁止bind()
这样做(因为绑定的仿函数应该可以重复调用,没有他们的约束参数被移动了。因此,我们需要重新实现std::thread
的ctor以避免使用bind()
。