C++11 C++;Visual Studio中的11线程异常传播(Express 2013)
我的问题是:以下观察到的行为是与C++11规范一致的,还是Microsoft对该语言的扩展 在一个测试程序(使用Visual Studio Express 2013)中,我正在测试从线程中运行的函数到父线程的异常传播。没有使用指定的异常指针,一切正常。。。这让我怀疑这是否真的是微软对该语言的扩展 所以我设置了“禁用语言扩展”,现在甚至没有Hello World编译器(C2400:内联汇编程序语法错误),所以我不知道观察到的行为是否与标准一致 阅读这里的其他一些问题给我的印象是,下面的方法不应该奏效C++11 C++;Visual Studio中的11线程异常传播(Express 2013),c++11,C++11,我的问题是:以下观察到的行为是与C++11规范一致的,还是Microsoft对该语言的扩展 在一个测试程序(使用Visual Studio Express 2013)中,我正在测试从线程中运行的函数到父线程的异常传播。没有使用指定的异常指针,一切正常。。。这让我怀疑这是否真的是微软对该语言的扩展 所以我设置了“禁用语言扩展”,现在甚至没有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
}
}
int myFunc(){throw;}
int main(){
auto-fut=std::async(myFunc);
//...
试一试{
int retVal=fut.get();
}
捕获(){
//匹配异常总是在父级中捕获
}
}
标准§30.6.6/17中的,std::future::get()
抛出:存储的异常,如果异常存储在共享状态
根据本标准§30.6.8/3,当使用std::async()
策略std::launch::async
时
执行INVOKE(decage\u COPY(std::forward(f))、decage\u COPY(std::forward(args))…)
时传播的任何异常都将作为异常结果存储在共享状态中
对于policystd::launch::deferred
,不需要特殊的行为来传播异常
因此,是的,该行为与标准§30.6.6/17中的C++11规范一致,std::future::get()
抛出:存储的异常,如果异常存储在共享状态
根据本标准§30.6.8/3,当使用std::async()
策略std::launch::async
时
执行INVOKE(decage\u COPY(std::forward(f))、decage\u COPY(std::forward(args))…)
时传播的任何异常都将作为异常结果存储在共享状态中
对于policystd::launch::deferred
,不需要特殊的行为来传播异常
因此,是的,此行为与C++11规范一致。仅出于完整性的考虑——正如上面问题中所述,当禁用语言扩展时,Visual Studio会出现这些“内联汇编程序”错误。当我进一步减少我的Hello World程序时,我发现当我不包含时,问题就消失了。在MS论坛中的一些检查导致了一个帖子回答,声称当使用某些模板语法时会发生这种情况。可能在标题中使用了该语法。这个编译器问题在2007年的一篇文章中得到了回答。仅出于完整性的考虑——正如上面的问题所述,当语言扩展被禁用时,VisualStudio会出现这些“内联汇编程序”错误。当我进一步减少我的Hello World程序时,我发现当我不包含时,问题就消失了。在MS论坛中的一些检查导致了一个帖子回答,声称当使用某些模板语法时会发生这种情况。可能在标题中使用了该语法。这一编译器问题在2007年的一篇帖子中被提到。