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

时间:2014-03-17 17:31:50

标签: c++11

我的问题是:以下观察到的行为是否与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 

    }
}

1 个答案:

答案 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规范一致。