提问者:小点点

C 03 throw() 说明符 C 11 noexcept 之间的区别


throw() 和 no除了分别在运行时和编译时检查之外,还有什么区别吗?

这篇Wikipedia C 11文章建议弃用C 03抛出说明符。
为什么是这样,no的能力足以在编译时涵盖所有这些吗?

[注意:我检查了这个问题和这篇文章,但无法确定弃用的确切原因。


共3个答案

匿名用户

异常说明符已被弃用,因为异常说明符通常是一个糟糕的想法<添加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

相关问题