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 @   海_纳百川  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
本站总访问量8979586
 
点击右上角即可分享
微信分享提示