c11中使用noexcept来说明某个函数是否会抛出异常,如下
void fun1() noexcept; //不会抛出异常
void fun2(); //可能抛出异常
编译器是不会在编译阶段检查noexcept的,所以可以申明不抛出异常,但是在函数体内抛出异常也是可以编译通过的,只是这个情况下一旦抛出异常,程序就会被终止掉,如下:
void fun() noexcept {
throw exception();
}
noexcept还可以当作一个运算符,返回一个bool类型的右值,如
void fun() noexcept(noexcept(g())) //fun是否抛出将和g()一致
noexcept还会用在函数指针,虚函数方面
函数指针: 函数指针及该指针指向的函数需要具有一致的异常,即:不抛出异常的只能指向不抛出异常的函数,可能抛出的可以指向可能抛出的也可以指向不抛出的,即:
void fun1() noexcept; //不抛出
void fun2(); //可能抛出
void (*pf)() noexcept = fun1; //ok
pf = fun2; //error
虚函数:基类里面的虚函数的异常说明需要和派生类中的一致,具体参考函数指针,示例如下:
class base{
public:
virtual void fun() noexcept;
vitrual void g();
}
class derived : public base{
public:
void fun(); //error
void g() noexcept; //ok
}