9

对于以下代码

struct X
{
    int x;
    X() noexcept try : x(0)
    {
    } 
    catch(...)
    {
    }
};

Visual Studio 14 CTP 发出警告

警告 C4297:“X::X”:假定函数不会引发异常,但会引发异常

注意:函数上指定了 __declspec(nothrow)、throw()、noexcept(true) 或 noexcept

这是滥用noexcept吗?或者它是微软编译器中的一个错误?

4

1 回答 1

11

或者它是微软编译器中的一个错误?

不完全的。

像这样的所谓函数try-block 并不能防止异常出现。考虑到对象永远不会完全构造,因为构造函数无法完成执行。-blockcatch必须抛出其他东西,否则当前异常将被重新抛出([except.handle]/15):

如果控制到达构造函数或析构函数的函数尝试块的处理程序的末尾,则重新抛出当前处理的异常。

因此编译器推断构造函数确实可以抛出。

struct X
{
    int x;
    X() noexcept : x(0)
    {
        try
        {
            // Code that may actually throw
        }
        catch(...)
        {
        }
    } 
};

应该在没有警告的情况下编译。

于 2014-10-08T22:25:12.773 回答