a.l*_*ram 8 c++ visual-c++ noexcept c++11 c++14
对于以下代码
struct X
{
int x;
X() noexcept try : x(0)
{
}
catch(...)
{
}
};
Run Code Online (Sandbox Code Playgroud)
Visual Studio 14 CTP发出警告
警告C4297:'X :: X':函数假定不抛出异常,但确实如此
注意:在函数上指定了__declspec(nothrow),throw(),noexcept(true)或noexcept
这是滥用noexcept吗?或者它是Microsoft编译器中的错误?
Col*_*mbo 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(...)
{
}
}
};
Run Code Online (Sandbox Code Playgroud)
应该编译没有警告.