在使用打包任务时,我遇到了一些非常奇怪的事情。阅读~packaged_task时,我得到的印象是,如果std::packaged_task
在执行之前被销毁,则承诺将被破坏,并且尝试从未来获得结果应该抛出std::future_error
。< / p>
但是,在Visual Studio 2013上,似乎并非如此。请使用以下代码:
#include <iostream>
#include <future>
#include <functional>
int main() {
std::future<int> f;
{
std::packaged_task<int()> task([](){return 3; });
f = task.get_future();
}
std::cout<<f.get()<<std::endl;
return 0;
}
我希望在std::future_error
上获得f.get()
,而是阻止它,等待打包的任务被执行。
尝试另一个编译器:http://ideone.com/Wt0WOc确实会抛出std::future_error("Broken promise")
...
我在Visual Studio 2013中看到了一个错误,或者我错过了哪些内容?
答案 0 :(得分:10)
你是对的。 ~packaged_task()
放弃共享状态(§30.6.9.1[futures.task.members] / p9),这意味着,如果共享状态尚未就绪,则存储类型为future_error
且具有错误条件的异常对象broken_promise
,然后使共享状态准备好;然后释放共享状态(§30.6.4[futures.state] / p7)。
这是known bug,will be fixed在Visual Studio的下一个版本中,可能在2015年的某个时候出现。它也在CTP中得到修复,但这是一个非常糟糕的主意将其用于生产代码...
答案 1 :(得分:7)
我认为这是一个错误,标准说~packaged_task
放弃共享状态,这意味着如果它还没有准备好,它应该存储broken_promise
异常并使状态准备就绪,就像你期待。
完全披露:你的ideone.com测试使用GCC并且我实现了GCC的<future>
所以当我说它的行为是正确的时候我可能会有偏见......但我认为它仍然是正确的; - )