C++11 noexcept用法

  • C++11 引入了noexcept,它有两类作用:noexcept 指定符和noexcept 运算符。

noexcept 指定符

  • 含义:指定函数是否抛出异常。
  • 两类语法:
noexcept    //同noexcept(true)
noexcept(expression)   
  • 举例:
void f() noexcept; // 函数 f() 不抛出异常
void (*fp)() noexcept(false); // fp是函数指针, 指向的函数可能抛出异常
void g(void pfa() noexcept);  // g函数的形式参数,接收指向不抛出异常的函数指针
//typedef int (*pf)() noexcept; // 错误

noexcept 运算符

  • 含义:noexcept运算符进行编译时检查,若表达式声明为不抛出任何异常则返回true。
  • 语法:
noexcept( expression ) 
//返回bool类型的纯右值
  • 解释:
    1. noexcept 运算符不对 expression 求值
    2. C++17起:若 expression的潜在异常集合为空则结果为true,否则为false
    3. C++17前: 若 expression含有至少一个下列潜在求值的构造则结果为 false:
1. 调用无不抛出异常指定的任意类型函数,除非它是常量表达式;
2. throw 表达式;
3. 目标类型是引用类型,且转换需要运行时检查时的dynamic_cast表达式;
4. 参数类型是多态类类型的 typeid 表达式。 
所有其他情况下结果是true

用于函数模板

  • noexcept 指定符和noexcept 运算符配合用于函数模板,以声明函数将对某些类型抛出异常,但不对其他类型抛出。
template <class T>
void fun() noexcept(noexcept(T()))
{
    .....
}

你可能感兴趣的:(C++11 noexcept用法)