【发布时间】:2020-02-27 13:17:27
【问题描述】:
这个关键字是不是有点反直觉?
这个函数不会抛出任何异常,所以我们给它添加了一个 throw() 标签。它应该是silent()还是类似的东西?
【问题讨论】:
-
它就是这样,或者更确切地说是过去,是“为什么?”的唯一答案。是“因为 Bjarne Stroustrup”。
标签: c++ exception exception-specification
这个关键字是不是有点反直觉?
这个函数不会抛出任何异常,所以我们给它添加了一个 throw() 标签。它应该是silent()还是类似的东西?
【问题讨论】:
标签: c++ exception exception-specification
从 C++17 之前的角度来看:这可能是违反直觉的,但只是暂时的。 throw(type, type, ...) 提供了函数可能抛出的异常类型列表。 throw() 提供了一个 empty 类型列表,即该函数不能抛出任何类型的异常。
【讨论】:
throw() = 可以抛出这些异常:""
也就是说,不能扔任何东西。
历史上,提供了一个真实的列表:throw(X,Y,Z) 的意思是“可以抛出X,或Y 或Z”。该语法已被删除,因为它并没有真正有用:最有用的保证是函数不能抛出任何东西。
【讨论】:
可以选择使用throw() 说明符(称为exception specification)声明函数,以列出允许抛出的异常类型。如果列表为空,则根本不允许该函数抛出任何异常。如果函数有throw() 说明符并抛出不在列表中的异常,则程序默认立即终止(此行为可以在运行时自定义)。
throw() 说明符的这种用法在 C++11 中已弃用,空 throw() 说明符的特定情况已替换为新的 noexcept 说明符。
在 C++17 中,非空的 throw() 说明符已从语言中移除,而空的 throw() 说明符在 C++20 中已移除。
【讨论】:
该关键字已弃用,在当前标准中为“noexcept”
【讨论】:
throw 是用来抛出异常的。