首页 > 编程语言 >c++ noexcept用法

c++ noexcept用法

时间:2024-11-06 23:32:29浏览次数:1  
标签:函数 doSomething 抛出 noexcept c++ 用法 异常 void

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,并在编译时确定函数是否抛出异常。

标签:函数,doSomething,抛出,noexcept,c++,用法,异常,void
From: https://www.cnblogs.com/chentiao/p/18531267

相关文章

  • c++final用法
    在C++中,classJsonfinal 的 final 关键字用于防止该类被继承,表示 Json 是一个最终类,不能被其他类继承。具体来说:final 关键字:当在类定义后添加 final 时,编译器会确保没有其他类可以继承这个类。如果尝试继承它,将导致编译错误。例如:classJsonfinal{//类的定......
  • c++中::的用法
    kernel::Module 这种用法表明 Module 是位于 kernel 命名空间或命名模块中的一个类型或对象。在C++中,这样的用法用于访问特定命名空间下的类、结构体、函数或其他成员。以下是一些可能的情况,取决于上下文:命名空间(Namespace):如果 kernel 是一个命名空间(通常在C++中是这......
  • C++ 在模板三个阶段检查错误
    第一个阶段是编译模板本身时。在这个阶段,编译器通常不会发现很多错误。编译器可以检查语法错误,例如忘记分号或者变量名拼错等,但也就这么多了。第二个阶段是编译器遇到模板使用时。在此阶段,编译器仍然没有很多可检查的。对于函数模板调用,编译器通常会检查实参数目是否正确。它还能......
  • C++智能指针
    C++智能指针以引用计数为基础的智能指针,引用计数的管理逻辑如下:除了初始化对象本身外,每个构造函数(拷贝构造函数除外)还要在堆上创建一个引用计数,用来记录有多少个对象共享状态。当我们创建一个对象时,只有一个对象共享状态,因此将引用计数初始化为1;拷贝构造函数不分配新的计数器......
  • C/C++中的volatile
    C/C++中的volatile约定Volatile这个话题,涉及到计算机科学多个领域多个层次的诸多细节。仅靠一篇博客,很难穷尽这些细节。因此,若不对讨论范围做一些约定,很容易就有诸多漏洞。到时误人子弟,就不好了。以下是一些基本的约定:1这篇博文讨论的volatile关键字,是C和C++语言中的......
  • c++蠕虫文学
    c++犹如蠕虫一样侵蚀你的大脑一起来看看    一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?   这里要求不足......
  • C++手撕 --基本数据结构的简单实现(2)
    C++面试手撕代码----基本数据结构的简单实现(2)1.哈希表(unordered_map):#include<vector>#include<iostream>#include<list>//forlist#include<utility>//forpair#include<functional>//forstd::hashusingnamespacestd;template<typ......
  • LevelDB 源码中的 C++ 奇淫技巧
    LevelDB整体代码还是比较好懂,没有用很多C++奇淫技巧。不过还是有部分实现,相当比较少见,比如柔性数组、链接符号导出、Pimpl类设计等。本文会梳理这里的C++高级技巧,帮助更好地理解LevelDB的实现。柔性数组在util/cache.cc的LRUHandle结构体定义中,有一个柔性数组(fl......
  • new和malloc的区别,分别解释它们的用法
    new new是 C++的一个运算符,用于动态分配对象在堆内存中的空间。它不仅负责内存分配,还会调用对象的构造函数。分配基本的数据类型int*pInt=newint;//分配一个int类型的内存*pInt=10;//使用分配的内存分配数组int*pArray=newint[5];//......
  • C++算法相关一些小细节
    C++算法相关一些小细节cin>>stl;//输入字符串时,遇到空格或者回车就会停止cout<<stl<<endl;//输出字符串时,遇到空格或者回车不会停止若要往字符数组读入一行字符串,包括空格,那么就要写成           String类1. 2.3.不能用printf直接......