以下代码
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编译器中的错误?
答案 0 :(得分: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(...)
{
}
}
};
应该在没有警告的情况下编译。