Emi*_* L. 15 c++ future packaged-task c++11 visual-studio-2013
在使用打包任务时,我遇到了一些非常奇怪的事情.当读取~packched_task时,我得到的印象是,如果a std::packaged_task在执行之前被销毁,那么承诺将被破坏并且尝试从未来获得结果应该抛出std::future_error.
但是,在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;
}
Run Code Online (Sandbox Code Playgroud)
我期待得到一个std::future_error开启,f.get()但它阻止,等待打包的任务被执行.
尝试另一个编译器:http://ideone.com/Wt0WOc确实扔了std::future_error("Broken promise")...
我是否在Visual Studio 2013中看到了一个错误或者我错过了什么?
T.C*_*.C. 10
你是对的.~packaged_task()放弃共享状态(§30.6.9.1[futures.task.members]/p9),这意味着,如果共享状态尚未就绪,则存储future_error具有错误条件的类型的异常对象broken_promise,然后使共享状态准备就绪; 然后释放共享状态(§30.6.4[futures.state]/p7).
这是一个已知的错误,将在Visual Studio的下一个版本中修复,可能会在2015年的某个时候出现.它也在CTP中修复,但将它用于生产代码是一个非常糟糕的主意......
我认为这是一个错误,标准说~packaged_task放弃共享状态,这意味着如果它还没有准备好它应该存储broken_promise异常并使状态准备好,就像你期望的那样.
完全披露:您的ideone.com测试使用GCC并且我实施了GCC,<future>所以当我说它的行为是正确的时候我可能会有偏见...但我认为它仍然是正确的;-)
| 归档时间: |
|
| 查看次数: |
886 次 |
| 最近记录: |