noexcept
是C++中的一种关键字,用于指定一个函数在执行时不会抛出异常。这一关键字可以提高代码的安全性,并允许编译器进行额外的优化。具体来说:
-
函数不会抛出异常:当一个函数被声明为
noexcept
时,表示该函数在任何情况下都不会抛出异常。如果函数实际抛出异常,将导致程序直接调用std::terminate()
并异常退出,而不会传播异常。void myFunction() noexcept { // 函数体 }
-
编译器优化:标记为
noexcept
的函数允许编译器做出一些优化。例如,它可以消除异常处理相关的代码开销,因为它确信在这个函数中不会有异常被抛出。 -
条件
noexcept
:可以使用条件表达式来指定在某些条件下函数是否为noexcept
。这在模板编程中尤其有用,允许根据模板参数决定是否使用noexcept
。template <typename T> void myTemplateFunction(T t) noexcept(noexcept(t.doSomething())) { t.doSomething(); }
这里,
noexcept(t.doSomething())
会在t.doSomething()
不会抛出异常时返回true
,从而使myTemplateFunction
成为noexcept
函数。 -
与标准库的兼容性:C++标准库中许多函数和操作符在适用的情况下都使用了
noexcept
,比如移动构造函数和析构函数等。为自定义类添加noexcept
声明可以使其与标准库中的容器和算法更好地兼容和优化。
例子
#include <iostream>
#include <vector>
void safeFunction() noexcept {
// 确保这个函数不会抛出异常
}
void riskyFunction() {
throw std::runtime_error("Error"); // 可能抛出异常
}
int main() {
std::cout << std::boolalpha;
std::cout << "safeFunction is noexcept: " << noexcept(safeFunction()) << std::endl;
std::cout << "riskyFunction is noexcept: " << noexcept(riskyFunction()) << std::endl;
return 0;
}
输出结果
safeFunction is noexcept: true
riskyFunction is noexcept: false
在这个例子中,noexcept
运算符用于检查函数是否为 noexcept
,并在编译时确定函数是否抛出异常。