我在运行这个网上找到的例子时遇到了一些麻烦。
void asyncFun(std::promise<int> intPromise) {
int result=5;
try {
// calculate the result
intPromise.set_value(result);
}
catch (...) {
intPromise.set_exception(std::current_exception());
}
}
int _tmain(int argc, _TCHAR* argv[]) {
std::promise<int> intPromise;
std::future<int> intFuture = intPromise.get_future();
std::thread t(asyncFun, std::move(intPromise));
std::cout << "Main thread" << std::endl;
int result = intFuture.get(); // may throw MyException
std::cout << result<<std::endl;
return 0;
}
我得到了:
错误C2280:'std :: promise :: promise(const std :: promise&amp;)':尝试引用已删除的 功能c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ functional 1149 1 tryFuture
答案 0 :(得分:2)
这是您正在使用的实施中的错误。如果可以,请考虑升级。
std::thread
的参数必须为MoveConstructible,std::promise
满足这些要求。
它在http://webcompiler.cloudapp.net在线编译并运行(t.join()
中添加了main
。作为解决方法,您可以考虑“提供”引用(使用std::ref
并从promise
移动),但要警告悬挂引用以及此类解决方法。
此处的另一个解决方法是使用std::shared_ptr
并将std::promise
作为函数的参数。
void asyncFun(std::shared_ptr<std::promise<int>> intPromise) {
int result=5;
try {
// calculate the result
intPromise->set_value(result);
}
catch (...) {
intPromise->set_exception(std::current_exception());
}
}
int main() {
std::promise<int> intPromise;
std::future<int> intFuture = intPromise.get_future();
auto sh = std::make_shared<std::promise<int>>(std::move(intPromise));
std::thread t(asyncFun, sh);
std::cout << "Main thread" << std::endl;
int result = intFuture.get(); // may throw MyException
std::cout << result<<std::endl;
t.join();
return 0;
}