繁体   English   中英

function-try-block和noexcept

[英]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的误用吗? 或者它是Microsoft编译器中的错误?

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

不完全的。

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

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

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

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

应该编译没有警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM