[英]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.