【问题标题】:function-try-block and noexcept功能尝试块和 noexcept
【发布时间】:2014-12-03 17:29:56
【问题描述】:
如下代码
struct X
{
int x;
X() noexcept try : x(0)
{
}
catch(...)
{
}
};
Visual Studio 14 CTP 发出警告
警告 C4297:“X::X”:假定函数不会引发异常,但
会
注意:__declspec(nothrow)、throw()、noexcept(true) 或 noexcept 是
在函数上指定
这是对noexcept 的滥用吗?还是微软编译器的bug?
【问题讨论】:
标签:
c++
visual-c++
c++11
c++14
noexcept
【解决方案1】:
或者是微软编译器的错误?
不完全是。
像这样的所谓函数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(...)
{
}
}
};
应该在没有警告的情况下编译。