function-try-block和noexcept

时间:2014-10-08 22:12:27

标签: c++ visual-c++ c++11 c++14 noexcept

以下代码

struct X
{
    int x;
    X() noexcept try : x(0)
    {
    } 
    catch(...)
    {
    }
};

Visual Studio 14 CTP发出警告

  

警告C4297:' X :: X':函数假定不抛出异常但是   确实

     

注意:__ declspec(nothrow),throw(),noexcept(true)或noexcept是   在函数上指定

这是对noexcept的滥用吗?或者它是Microsoft编译器中的错误?

1 个答案:

答案 0 :(得分:11)

  

或者它是Microsoft编译器中的错误吗?

不完全。

像这样的所谓的函数try-block无法防止异常传到外面。考虑到对象永远不会完全构造,因为构造函数不能完成执行。 catch - 块必须抛出其他内容,否则将重新抛出当前异常([except.handle] / 15):

  

如果控件到达结尾,则重新抛出当前处理的异常   构造函数的 function-try-block 的处理程序或   析构函数。

因此编译器推断构造函数确实可以抛出。

struct X
{
    int x;
    X() noexcept : x(0)
    {
        try
        {
            // Code that may actually throw
        }
        catch(...)
        {
        }
    } 
};

应该在没有警告的情况下编译。