function-try-block和noexcept

a.l*_*ram 8 c++ visual-c++ noexcept c++11 c++14

对于以下代码

struct X
{
    int x;
    X() noexcept try : x(0)
    {
    } 
    catch(...)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

Visual Studio 14 CTP发出警告

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

注意:在函数上指定了__declspec(nothrow),throw(),noexcept(true)或noexcept

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

Col*_*mbo 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(...)
        {
        }
    } 
};
Run Code Online (Sandbox Code Playgroud)

应该编译没有警告.