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(...)
{
}
}
};
应该在没有警告的情况下编译