C++关键字 noexcept

2023-11-15

1. 关键字noexcept

从C++11开始,我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept

constexpr initializer_list() noexcept
	: _M_array(0), _M_len(0) { }

该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化。
如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会直接终止,调用std::terminate()函数,该函数内部会调用std::abort()终止程序。

2. C++的异常处理

C++中的异常处理是在运行时而不是编译时检测的。为了实现运行时检测,编译器创建额外的代码,然而这会妨碍程序优化。
在实践中,一般两种异常抛出方式是常用的:

  • 一个操作或者函数可能会抛出一个异常;
  • 一个操作或者函数不可能抛出任何异常。

后面这一种方式中在以往的C++版本中常用throw()表示,在C++ 11中已经被noexcept代替。

void swap(Type& x, Type& y) throw()   //C++11之前
{
	x.swap(y);
}
void swap(Type& x, Type& y) noexcept  //C++11
{
	x.swap(y);
}

3. noexcep的使用

  1. noexcept是标识符时, 它的作用是在函数后面声明一个函数是否会抛出异常.
  2. noexcept是函数时, 它的作用是检查一个函数是否会抛出异常.

备注:

noexcept编译期完成声明和检查工作.
noexcept主要是解决的问题是减少运行时开销. 运行时开销指的是, 编译器需要为代码生成一些额外的代码用来包裹原始代码,当出现异常时可以抛出一些相关的堆栈stack unwinding错误信息, 这里面包含,错误位置, 错误原因, 调用顺序和层级路径等信息.
当使用noexcept声明一个函数不会抛出异常候, 编译器就不会去生成这些额外的代码, 直接的减小的生成文件的大小, 间接的优化了程序运行效率.

4. noexcept作为标识符

noexcept标识符有几种写法: noexceptnoexcept(true)noexcept(false)noexcept(expression)throw().
其中noexcept默认表示noexcept(true).
noexcepttrue时表示函数不会抛出异常,
noexceptfalse时表示函数可能会抛出异常.
throw()表示函数可能会抛出异常, 不建议使用该写法, 应该使用noexcept(false), 因为 C++20 放弃这种写法.

// noexcept 标识符
// noexcept 相当于 noexcept(true)
// 声明 noexcept(true)之后, 将表示这个是不会报错的.
// 如果报错的话, 进程直接结束, 不会抛出异常信息.
void example() noexcept {
    cout << "hello called" << endl;
}

5. noexcept作为函数

noexcept函数用来检查一个函数是否声明了noexcept, 如果声明了noexcept(true)则返回true, 如果声明了noexcept(false)则返回false.

#include <iostream>
using std::cout;
using std::endl;
using std::boolalpha;

// noexcept 标识符
void foo() noexcept(true) {
    throw 4;
}

// noexcept 标识符
void bar() noexcept(false) {
    throw 4;
}

int main(void) {
    // noexcept 函数
    cout << boolalpha << noexcept(foo()) << endl;  // true
    cout << boolalpha << noexcept(bar()) << endl;  // false

    return 0;
}

noexcept函数 还可以在常规函数中配合noexcept(expression)标识符 共同完成对其他函数是否声明了 noexcept的检查.

#include <iostream>
using std::cout;
using std::endl;
using std::boolalpha;

struct foo {
    int a;
    void getFoo() noexcept(true) {
        cout << "foo.getFoo called" << endl;
    }
    void getBar() noexcept(false) {
        cout << "foo.getBar called" << endl;
    }
};

template<typename T>
void example_true(T t) noexcept(noexcept(t.getFoo())) {
    cout << "example called" << endl;
}

template<typename T>
void example_false(T t) noexcept(noexcept(t.getBar())) {
    cout << "example called" << endl;
}

int main(void) {
    foo x{};
    cout << boolalpha << noexcept(example_true(x)) << endl;    // true
    cout << boolalpha << noexcept(example_false(x)) << endl;   // false

    return 0;
}

转载自:https://www.jianshu.com/p/b371828cd54c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++关键字 noexcept 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • IP包流量分析程序

    使用套接字编程实现捕获一段时间内以本机为源地址或目的地址的IP数据包 不包括以广播形式发出的数据包 统计IP数据包的信息 列出本机与其他主机之间不同协议类型IP数据包的数量 及流量 以源地址 目的地址 协议类型 数据包数量 流量的格式输出统
  • failed to load response data出现的问题

    分片上传的时候 状态码请求是200的状态 但是 出现了 failed to load response data 没有response的返回 原因是 我分片的 每片大小太大了 分成了10M 所以出现了这个问题 const chunkSize
  • 【2-3】《Java基础语法》——二进制、变量、数据类型、标识符、数据类型转换、特殊变量定义、方法、运算符、变量作用域、编程规范、转义字符

    文章目录 基础语法 一 二进制 1 补码 2 二进制与十进制的转换 二 变量概述 三 数据类型 1 分类 2 范围 四 标识符 1 命名规则 2 Java中的关键字 3 定义变量 4 变量练习 五 数据类型转换 六 特殊变量定义 1 flo
  • nn.Module模块

    1 模块化接口nn torch nn是pytorch中专门为神经网络设计的模块化接口 nn构建于autograd之上 可以用来定义和运行神经网络 2 nn Module nn Module是nn中十分重要的类 包含网络各层的定义及forwa
  • 大神之路-起始篇

    欢迎关注 WeiyiGeek 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 作者主
  • rocketMQ启动报错,JavaHotSpot(TM) 64-Bit Server VM warning错误: 找不到或无法加载主类 Files\jdk1.8.0_161\\jre\lib\ext

    Java HotSpot TM 64 Bit Server VM warning Using the DefNew young collector with the CMS collector is deprecated and will
  • foreach用法_R语言--并行计算包(parallel、foreach)

    R语言是单核计算语言 在数据建模或计算过程中 常常出现相同或相似任务的重复计算 一般操作是for循环处理或采用apply族函数处理 为了更快完成计算 采用并行计算是更优的选择 本文采用R语言中的parallel包与foreach包实现并行计
  • ueditor-后台配置项返回格式出错,上传功能将不能正常使用!

    一 服务器环境 php centos apache 二 症状 ueditor编辑界面可以显示 但单图片上传按钮点击没反应 多图片上传显示 后台配置项返回格式出错 上传功能将不能正常使用 三 分析 1 打开浏览器调试模式 显示 后台配置项返回
  • Zookeeper——zookeeper基础

    在深入了解ZooKeeper的运作之前 让我们来看看ZooKeeper的基本概念 我们将在本章中讨论以下主题 Architecture 架构 Hierarchical namespace 层次命名空间 Session 会话 Watches
  • 剑指 Offer 06. 从尾到头打印链表

    从尾到头打印链表 蠢想法 解题思路 的节点顺序已经反转过来了 栈 package swordPointingToTheOffer import java util Stack 引用栈 public class six 初始化 Stack
  • MessageBoxA的用法

    一 函数原型 int fastcall MessageBox const char Text const char Caption int Flags 0x0 Flags表示对话框的按钮组合 取值有 MessageBox Flags def
  • 虚拟地址内存空间

    bss段详解 详细讲解
  • 一个简单的HttpClient使用案例

    HttpClient 是什么 HttpClient 是Apache Jakarta Common 下的子项目 可以用来提供高效的 最新的 功能丰富的支持 HTTP 协议的客户端编程工具包 并且它支持 HTTP 协议最新的版本和建议 该如何使
  • Web3-js的学习(5)-实现合约事件监听

    合约事件监听 latest 监听最新出块事件 pending 监听发布未进块事件 代码很简单 var Web3 require web3 var web3 new Web3 new Web3 providers HttpProvider h
  • 解决在Intellij IDEA中无法创建Servlet类的问题/New中没有Servlet类/创建不了Servlet类

    新手在学习Servlet相关知识的时候 一些课程往往会告知新手去使用IDEA自带的模板来创建Servlet 这样减少了注解等麻烦 降低了工作量 然而 如下图所示 很多人发现在自己的new一栏不存在Servlet类 如下图 网上的解决办法很多
  • 服务 -web服务器及ssh

    web服务器 文件共享 nfs samba 一般用于局域网中 ftp http 一般用于公网 tcp 80 httpd apache 1 完全开源 2 跨平台 3 支持多种编程语言 4 采用模块化的设计 5 安全稳定 IE www taob
  • 笔记/samba搭建

    1 安装 yum y install samba 2 配置 vim etc samba smb conf global 安全模式 user shared domain security user 认证模式 passdb backend td
  • autosar宏定义搜集

    1 AUTOSAR 长函数声明 2 教你如何阅读Autosar代码 1 概述 3 把AUTOSAR函数以及变量等定义的宏用脚本展开以提高可读性 4 Specification of Compiler Abstraction autosar
  • C语言满天星加月亮

    import java awt Color import java awt Graphics import javax swing JFrame import javax swing JPanel public class Stars pu
  • C++关键字 noexcept

    1 关键字noexcept 从C 11开始 我们能看到很多代码当中都有关键字noexcept 比如下面就是std initializer list的默认构造函数 其中使用了noexcept constexpr initializer lis