std :: packaged_task没有破坏对破坏的承诺?
使用打包任务时遇到了一些非常奇怪的事情。在阅读~packaged_task时,我得到的印象是,如果std::packaged_task
在执行之前被销毁,承诺将被破坏,并且试图从未来获得结果应该抛出std::future_error
。std :: packaged_task没有破坏对破坏的承诺?
但是,在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中的错误或有我错过了什么?
你是正确。 ~packaged_task()
放弃共享状态(§30.6.9.1[futures.task.members]/p9),这意味着如果共享状态没有准备好,则存储future_error
类型的异常对象,其出错条件为broken_promise
,然后使共享状态准备;然后释放共享状态(§30.6.4[futures.state]/p7)。
这是一个known bugwill be fixed在Visual Studio的下一个版本中,这可能会在2015年出现一段时间。它也在CTP中修复,但将它用于生产代码是一个非常糟糕的主意。
我认为这是一个bug,标准说~packaged_task
放弃了共享状态,这意味着如果它还没有准备好,它应该存储一个broken_promise
异常并使状态准备就绪,就像你期望的那样。
披露:您ideone.com测试使用GCC和我实现GCC的<future>
,所以当我说,它的行为是正确的,我可能有偏差......但我认为这仍然是正确的;-)
完全同意。被抛弃的“未来”(即这种情况下的返回值)是“broken_promise”的情况。 – starturtle 2016-06-14 07:17:07
所以我正确地阅读这些链接,这不会在VS 2013中修复? – 2014-09-10 10:46:16
@EmilyL。我说不太可能。根据[本页FAQ部分的Q5](http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking -changes-in-vs-2013.aspx),他们很少回溯bug修复。 – 2014-09-10 10:46:41
太棒了,我们购买的工作室还不到一年,他们已经离开了我们。 *感叹*感谢您的确认。接受这个答案,因为链接对我的怀疑进行了最后的确认。 – 2014-09-10 10:48:46