noexcept简介

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
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 4.高级主题 4.1 标准库特殊设施 tuple类型希望将一些数据合成单一对象,但又不想麻烦地定义一个新数据结构来...
    王侦阅读 4,010评论 0 0
  • 本文按照 cppreference[https://en.cppreference.com/w/] 列出的特性列表...
    401阅读 21,970评论 2 18
  • 异常的抛出 在C++中,通过throw一个表达式来引发异常,被抛出的表达式的类型以及当前的调用链共同决定了哪段处理...
    土豆吞噬者阅读 4,834评论 0 2
  • 类并非只能拥有友元函数,也可以将类作为友元。在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员。另...
    鬼枭嗜阅读 3,685评论 0 1
  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 5,902评论 0 1