我的问题是:以下观察到的行为是否与C ++ 11规范一致,或者它是该语言的Microsoft扩展?
在测试程序中(使用Visual Studio Express 2013)我正在测试从线程中的函数运行到父线程的异常传播。没有使用规定的异常指针,它一切正常......这让我想知道这是否实际上是对该语言进行的Microsoft扩展。
所以我设置了“禁用语言扩展”,现在甚至没有Hello World编译(C2400:内联汇编语法错误),所以我不知道观察到的行为是否与标准一致。
在这里阅读其他一些问题给我的印象是以下内容不起作用。
int myFunc() { throw <various types tried here>; }
int main() {
auto fut = std::async(myFunc);
//...
try {
int retVal = fut.get();
}
catch(<corresponding type here>) {
// matching exception is always caught here in parent
}
}
答案 0 :(得分:4)
来自标准的§30.6.6/ 17,std::future::get()
抛出:如果异常存储在共享状态中,则存储异常。
根据标准的§30.6.8/ 3,当std::async()
与政策std::launch::async
一起使用时,
从执行
INVOKE(DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...)
传播的任何异常都作为异常结果存储在共享状态中。
使用策略std::launch::deferred
,异常不会像观察到的那样向上传播。
所以是的,这种行为与C ++ 11规范一致。