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++98 用throw()
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