c++ noexcept用法

noexcept 是C++中的一种关键字,用于指定一个函数在执行时不会抛出异常。这一关键字可以提高代码的安全性,并允许编译器进行额外的优化。具体来说:

  1. 函数不会抛出异常:当一个函数被声明为 noexcept 时,表示该函数在任何情况下都不会抛出异常。如果函数实际抛出异常,将导致程序直接调用 std::terminate() 并异常退出,而不会传播异常。

    void myFunction() noexcept {
        // 函数体
    }
    
  2. 编译器优化:标记为 noexcept 的函数允许编译器做出一些优化。例如,它可以消除异常处理相关的代码开销,因为它确信在这个函数中不会有异常被抛出。

  3. 条件 noexcept:可以使用条件表达式来指定在某些条件下函数是否为 noexcept。这在模板编程中尤其有用,允许根据模板参数决定是否使用 noexcept

    template <typename T>
    void myTemplateFunction(T t) noexcept(noexcept(t.doSomething())) {
        t.doSomething();
    }
    

    这里,noexcept(t.doSomething()) 会在 t.doSomething() 不会抛出异常时返回 true,从而使 myTemplateFunction 成为 noexcept 函数。

  4. 与标准库的兼容性: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,并在编译时确定函数是否抛出异常。

posted @ 2024-11-06 23:26  海_纳百川  阅读(113)  评论(0)    收藏  举报
本站总访问量