iam*_*ind 94 c++ exception throw noexcept c++11
有没有之间的任何其他差别throw()
和noexcept
除了被检查的运行时分别编译时间?
维基百科C++ 11文章表明不推荐使用C++ 03 throw说明符.
为什么这样,noexcept
有足够的能力在编译时覆盖所有这些?
Nic*_*las 119
异常说明符已被弃用,因为异常说明符通常是一个糟糕的主意.noexcept
之所以添加,是因为它是一个合理有用的异常说明符:知道函数何时不会抛出异常.因此它成为二元选择:将抛出的函数和不会抛出的函数.
noexcept
添加而不是仅删除所有throw说明符,throw()
因为noexcept
更强大.noexcept
可以有一个参数,编译时解析成一个布尔值.如果布尔值为真,那么noexcept
棒.如果布尔值为false,则noexcept
不会粘住,函数可能会抛出.
因此,您可以这样做:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Run Code Online (Sandbox Code Playgroud)
是否CreateOtherClass
抛出异常?它可能,如果T
是默认构造函数可以.我们怎么说?像这样:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Run Code Online (Sandbox Code Playgroud)
因此,CreateOtherClass()
抛出iff给定类型的默认构造函数抛出.这解决了异常说明符的一个主要问题:它们无法传播调用堆栈.
你不能这样做throw()
.
CB *_*ley 32
noexcept
在编译时不会检查.
实现不应仅仅因为执行时抛出或抛出包含函数不允许的异常而拒绝表达式.
当声明noexcept
或throw()
尝试抛出异常的函数时,唯一的区别是一个调用terminate
和其他调用unexpected
以及后一种异常处理方式实际上已被弃用.
归档时间: |
|
查看次数: |
22001 次 |
最近记录: |