【问题标题】:Why c++ use throw() keyword to indicate the function won't throw any exceptions [duplicate]为什么c ++使用 throw() 关键字来指示函数不会抛出任何异常[重复]
【发布时间】:2020-02-27 13:17:27
【问题描述】:

这个关键字是不是有点反直觉?

这个函数不会抛出任何异常,所以我们给它添加了一个 throw() 标签。它应该是silent()还是类似的东西?

【问题讨论】:

标签: c++ exception exception-specification


【解决方案1】:

从 C++17 之前的角度来看:这可能是违反直觉的,但只是暂时的。 throw(type, type, ...) 提供了函数可能抛出的异常类型列表。 throw() 提供了一个 empty 类型列表,即该函数不能抛出任何类型的异常。

【讨论】:

    【解决方案2】:

    throw() = 可以抛出这些异常:""

    也就是说,不能扔任何东西。

    历史上,提供了一个真实的列表:throw(X,Y,Z) 的意思是“可以抛出X,或YZ”。该语法已被删除,因为它并没有真正有用:最有用的保证是函数不能抛出任何东西。

    【讨论】:

      【解决方案3】:

      可以选择使用throw() 说明符(称为exception specification)声明函数,以列出允许抛出的异常类型。如果列表为空,则根本不允许该函数抛出任何异常。如果函数有throw() 说明符并抛出不在列表中的异常,则程序默认立即终止(此行为可以在运行时自定义)。

      throw() 说明符的这种用法在 C++11 中已弃用,空 throw() 说明符的特定情况已替换为新的 noexcept 说明符。

      在 C++17 中,非空的 throw() 说明符已从语言中移除,而空的 throw() 说明符在 C++20 中已移除。

      【讨论】:

        【解决方案4】:

        该关键字已弃用,在当前标准中为“noexcept”

        【讨论】:

        • 不,throw 是用来抛出异常的。
        • 澄清:关键字用于多个地方,包括抛出表达式异常规范。请参阅 Remy Labeau 对后者的回答。该关键字没有被弃用,实际上它正在积极用于 throw 语句。
        • 异常规范不推荐使用该关键字
        猜你喜欢
        • 2018-03-05
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多