有什么区别吗throw()
and noexcept
除了分别在运行时和编译时检查之外?
这篇维基百科 C++11 文章建议弃用 C++03 throw 说明符。
为什么会这样...是noexcept
有足够的能力在编译时涵盖所有这些吗?
注:我检查过这个问题 and 本文,但无法确定其弃用的确切原因。
异常说明符已被弃用,因为异常说明符通常是一个糟糕的主意. noexcept
被添加是因为它是异常说明符的一种相当有用的用途:知道函数何时won't抛出异常。因此,它变成了一个二元选择:会抛出异常的函数和不会抛出异常的函数。
noexcept
添加了而不是仅仅删除除throw()
因为noexcept
更强大。noexcept
可以有一个编译时解析为布尔值的参数。如果布尔值为 true,则noexcept
棍子。如果布尔值为假,则noexcept
不粘,函数可能会抛出异常。
因此,你可以这样做:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Does CreateOtherClass
抛出异常?可能,如果T
的默认构造函数就可以。我们怎么知道?像这样:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Thus, CreateOtherClass()
当且仅当给定类型的默认构造函数抛出异常时才会抛出异常。这解决了异常说明符的主要问题之一:它们无法向上传播调用堆栈。
你不能这样做throw()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)