noexcept修饰符和noexcept操作符

1. 弃用throw

我们可能见过的异常处理 长这个样子

void except_fun() throw(int, double) {  }

但是由于该特性很少被使用到,所以被弃用了
表示函数不会抛出异常的throw() 也已经被新的关键字noexcept关键字代替

2.noexcept

表示其修饰的函数 不会抛出异常,在西皮皮11中,如果noexcept修饰的函数抛出了异常,那么编译器会调用std::terminate()直接终止运行了,
从语法上面讲 有两种形式

void fun() noexcept { ...}

void fun() noexcept(常量表达式) {... }

为true表明函数不会抛出异常,false则会抛出异常
当noexcept作为操作符的时候

template <typename T>
void Fun() noexcept(noexcept(T()));

第二个noexcept就是作为操作符,当其参数是一个可能抛出异常的表达式的时候,返回值为false,否则为true

3.

虽然noexcept关键字修饰的函数,只是调用了std::terminate()函数,简单暴力的结束了程序的运行,带来了很多问题,比如析构函数没有被调用,栈没有被释放啊等等,但是他被广泛的用在C++11的标准库中,用来提高标准库的性能,以及满足一些阻止异常扩散的需求

C++98throw()
template <typename T>
class A
{
     static constexpr T min() throw() { return T(); }
     static constexpr T max() throw() { return T(); }
};

C++11
template <typename T>
class B
{
     static constexpr T min() noexcept { return T(); }
     static constexpr T max() noexcept { return T(); }
};

noexcept更大的作用是保护应用程序的安全,比如一个类的析构函数,就不应该抛出异常,那么对于常被析构调用的 delete函数来说,它也不应该抛出异常,所以C++11默认将delete函数设置为noexcept,提高应用程序的安全

void operator delete(void*) noexcept;
void operator delete[](void*) noexcept;

同样的西皮皮11类的默认析构函数 也是noexcept(true)的,除非你显示的指定false

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值