对于以下代码
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(...)
{
}
}
};
应在没有警告的情况下编译。