C++11 C++;Visual Studio中的11线程异常传播(Express 2013)

C++11 C++;Visual Studio中的11线程异常传播(Express 2013),c++11,C++11,我的问题是:以下观察到的行为是与C++11规范一致的,还是Microsoft对该语言的扩展 在一个测试程序(使用Visual Studio Express 2013)中,我正在测试从线程中运行的函数到父线程的异常传播。没有使用指定的异常指针,一切正常。。。这让我怀疑这是否真的是微软对该语言的扩展 所以我设置了“禁用语言扩展”,现在甚至没有Hello World编译器(C2400:内联汇编程序语法错误),所以我不知道观察到的行为是否与标准一致 阅读这里的其他一些问题给我的印象是,下面的方法不应该奏

我的问题是:以下观察到的行为是与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))…)
时传播的任何异常都将作为异常结果存储在共享状态中

对于policy
std::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))…)
时传播的任何异常都将作为异常结果存储在共享状态中

对于policy
std::launch::deferred
,不需要特殊的行为来传播异常

因此,是的,此行为与C++11规范一致。

仅出于完整性的考虑——正如上面问题中所述,当禁用语言扩展时,Visual Studio会出现这些“内联汇编程序”错误。当我进一步减少我的Hello World程序时,我发现当我不包含时,问题就消失了。在MS论坛中的一些检查导致了一个帖子回答,声称当使用某些模板语法时会发生这种情况。可能在标题中使用了该语法。这个编译器问题在2007年的一篇文章中得到了回答。仅出于完整性的考虑——正如上面的问题所述,当语言扩展被禁用时,VisualStudio会出现这些“内联汇编程序”错误。当我进一步减少我的Hello World程序时,我发现当我不包含时,问题就消失了。在MS论坛中的一些检查导致了一个帖子回答,声称当使用某些模板语法时会发生这种情况。可能在标题中使用了该语法。这一编译器问题在2007年的一篇帖子中被提到。