function-try-block and 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吗?或者这是微软编译器中的一个错误?

或者这是微软编译器中的一个错误?

不完全是。

像这样的所谓函数try块不能阻止异常进入外部。请考虑,由于构造函数无法完成执行,因此对象从未完全构造好。catch-块必须抛出其他东西,否则当前异常将被重新抛出([ixcept.handle]/15):

如果控制到达末尾,则会重新引发当前处理的异常构造函数的函数try块的处理程序的析构函数。

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

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

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

最新更新