throw()
和 no除了分别在运行时和编译时检查之外,还有
什么区别吗?
这篇Wikipedia C 11文章建议弃用C 03抛出说明符。
为什么是这样,no的
能力足以在编译时涵盖所有这些吗?
[注意:我检查了这个问题和这篇文章,但无法确定弃用的确切原因。
异常说明符已被弃用,因为异常说明符通常是一个糟糕的想法<添加code>noexcept是因为它是异常说明符的一个合理有用的用法:知道函数何时不会抛出异常。因此,它变成了一个二进制选择:将抛出的函数和不抛出的函数。
添加了noexcept
,而不是删除除throw()
之外的所有throw说明符,因为noexcept
更强大noexcept
可以有一个编译时解析为布尔值的参数。如果布尔值为真,则noexcept
将继续。如果布尔值为false,则noexcept
不会出现,函数可能会抛出。
因此,您可以这样做:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
如果T
的默认构造函数可以,Create其他类
会抛出异常吗?我们怎么知道?像这样:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
因此,Create其他类()
将抛出给定类型的默认构造函数抛出。这修复了异常说明符的主要问题之一:它们无法向上传播调用堆栈。
您不能使用throw()
来执行此操作。
no的
在编译时不检查。
实现不应仅仅因为表达式在执行时会引发或可能引发包含函数不允许的异常而拒绝表达式。
当声明为< code>noexcept或< code>throw()的函数试图抛出异常时,唯一的区别是一个调用< code>terminate,另一个调用< code>unexpected,后一种异常处理方式实际上已被弃用。
当违反动态异常规范时,C 运行时会调用 std::unexpected():
从异常规范禁止此类型异常的函数引发异常。
std::意外()
也可以直接从程序中调用。
在这两种情况下,std::unexpected
调用当前安装的td::unxpected_handler
。默认的std::expected_handler
调用std::terminate
。