【问题标题】: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(...)
            {
            }
        } 
    };
    

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

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 2021-02-24
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多