C++ 函数try块和noexcept

C++ 函数try块和noexcept,c++,visual-c++,c++11,c++14,noexcept,C++,Visual C++,C++11,C++14,Noexcept,对于以下代码 struct X { int x; X() noexcept try : x(0) { } catch(...) { } }; VisualStudio14CTP发出警告 警告C4297:“X::X”:假定函数不引发异常,但 做 注意:_declspec(nothrow)、throw()、noexcept(true)或noexcept是 在函数上指定 这是不是误用了noexcept?或者它是Microsoft编译器中的一个

对于以下代码

struct X
{
    int x;
    X() noexcept try : x(0)
    {
    } 
    catch(...)
    {
    }
};
VisualStudio14CTP发出警告

警告C4297:“X::X”:假定函数不引发异常,但 做

注意:_declspec(nothrow)、throw()、noexcept(true)或noexcept是 在函数上指定

这是不是误用了
noexcept
?或者它是Microsoft编译器中的一个bug

或者它是Microsoft编译器中的一个bug

不完全是

像这样的所谓函数try块不能防止异常进入外部。考虑到构造函数无法完成执行,所以该对象从未完全构造过。
catch
-块必须抛出其他内容,否则当前异常将被重新抛出([except.handle]/15):

如果控件到达末尾,则当前处理的异常将被重试 函数的处理程序或构造函数的try块的 析构函数

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

struct X
{
    int x;
    X() noexcept : x(0)
    {
        try
        {
            // Code that may actually throw
        }
        catch(...)
        {
        }
    } 
};
应该在没有警告的情况下编译