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

除了被检查的运行时和编译时间,throw()和noexcept之间有什么其他区别吗?

Wikipedia C++11文章建议不推荐使用C 03 throw说明符。
为什么,noexcept能够足够覆盖编译时的所有?

[注:我提到了this questionthis article,但没有得到贬损的坚实理由。

最佳答案
异常说明符已弃用,因为exception specifiers are generally a terrible idea.添加了noexcept,因为它是异常说明符的一个合理有用的使用:知道函数何时不会抛出异常。因此,它成为一个二元选择:将抛出的函数和不会抛出的函数。

noexcept被添加,而不是只是删除除throw()之外的所有throw说明符,因为noexcept更强大。 noexcept可以有一个参数,编译时解析成一个布尔值。如果布尔值为true,那么noexcept将停止。如果布尔值为假,那么noexcept不会粘住,函数可能会抛出。

因此,你可以这样做:

struct<typename T>
{
  void CreateOtherClass() { T t{}; }
};

CreateOtherClass是否抛出异常?它可能,如果T的默认构造函数可以。我们如何告诉?喜欢这个:

struct<typename T>
{
  void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};

因此,CreateOtherClass()将抛出iff给定类型的默认构造函数throws。这修复了异常说明符的一个主要问题:它们不能向上传播调用堆栈。

你不能这样用throw()。

转载注明原文:C 03 throw()之间的区别C 11 noexcept - 代码日志