noexcept修饰符和noexcept操作符可以说是两个概念,C++标准委员会给noexcept的这两种用法的定义如下:
noexcept修饰符:指定函数是否抛出异常。
noexcept操作符:运算符进行编译时检查,最终返回一个布尔值,根据布尔值决定是否抛出异常。
https://zh.cppreference.com/
在实际编程时通常用来排除逻辑上存在的不合理的场景。其实同样的功能在C98中就已经通过断言进行实现,断言是通过assert关键字实现,如果assert后面的表达式返回值为真程序就会终止执行。同样在C++中,也有一套单独的异常处理方式,通过throw关键字实现可以实现比C更加强大的异常处理功能。
大家可以看下现在公司的代码,是否存在下面这种异常抛出的写法:
void func() throw (int, double);
上面这段代码就表示函数func可能抛出的异常类型为整型或者浮点型。现在很多java代码还是这种写法。实际上,在C++中,这种写法是很少见的。也正因为此在C++11中,该写法被正式弃用。同时throw()也被noexcept替代,不过从C++17开始,标准委员会对throw()进行了重新定义,使其在功能上和noexcept等价。由此可见,在C++发展过程中,对于一些语法、特性的废弃或者不推荐只是暂时的,在未来的版本中仍然可能被重新使用。
1 noexcept修饰符
noexcept跟在函数名后面表示函数不会抛出异常,通常的写法为:
void f() noexcept;
这种写sh法默认noexcept表达式返回true。不抛出