首页 > 编程语言 >C++ -- noexcept关键字

C++ -- noexcept关键字

时间:2024-06-08 17:11:03浏览次数:10  
标签:std 函数 -- noexcept C++ throw

C++ -- noexcept关键字

noexcept关键字

作用:告诉编译器,函数中不会发生异常,有利于编译器对程序做出更多的优化,比如避免生成处理异常的额外代码,减少程序的大小

例子

声明了noexcept和没有声明的同一段代码:

safeDivide 当除数为0时,会直接调用std::terminate()来中止程序而不是throw错误

// use of use of the noexcept specifier 
#include <iostream> 
using namespace std; 

// Function that may throw an exception 
int divide(int a, int b) 
{ 
	if (b == 0) { 
		throw runtime_error("Error: Division by zero"); 
	} 
	return a / b; 
} 

// Function that will not throw any exceptions (using 
// noexcept) 
double safeDivide(double a, double b) noexcept 
{ 
	if (b == 0) { 
		// In this case, std::terminate will be called if b 
		// is zero 
		cerr << "Error: Division by zero in safeDivide"
			<< std::endl; 
		terminate(); 
	} 
	return a / b; 
} 

int main() 
{ 
	cout << "noexcept value for divide(): "
		<< noexcept(divide(10, 0)) << "\n"; 

	cout << "noexcept value for safeDivide(): "
		<< noexcept(safeDivide(10.0, 0.0)); 

	return 0; 
}

Output:
noexcept value for divide(): 0
noexcept value for safeDivide(): 1

有条件的noexcept:

// C++ code to demonstrate the use of the 
// noexcept specifier with a function template 
#include <bits/stdc++.h> 
using namespace std; 

template <typename T> 
void process(const T& value) 
	noexcept(noexcept(declval<T>().size())) 
{ 
	// Try to call the size() member function of T 
	// If T's size() can throw, this function won't be 
	// noexcept for T 
	// If T's size() is noexcept, this 
	// function will be noexcept for T 
	cout << "Size: " << value.size() << endl; 
} 

// main function 
int main() 
{ 
	vector<int> numbers = { 1, 2, 3, 4, 5 }; 

	// Won't throw exceptions for std::vector 
	process(numbers); 
	// May throw exceptions for int 
	process(42); 

	return 0; 
}

什么时候使用noexcept?

  1. 确认不会抛出异常的函数:包括其调用的所有函数都不会抛出异常,那就可以标记其为noexcept ,适用于简单的访问函数、数学运算函数或者只包含基本类型操作的函数
  2. 移动构造函数移动赋值运算符:这些特殊成员函数应当尽可能地标记为noexcept。因为它们在资源管理(如智能指针的转移)中非常重要,且不应失败。如果移动操作可能抛出异常,容器和其他代码可能会回退到较慢的复制操作上,影响性能。

关于什么是移动构造函数以及移动赋值运算符,可以看这篇文章:
C++--移动构造函数以及移动赋值运算符

标签:std,函数,--,noexcept,C++,throw
From: https://www.cnblogs.com/Mr-DC/p/18238775

相关文章

  • java小记
    今天学了一些计算机存储数据的原理:文本,图片,声音等存储编码:gb2312,Unicode,gbk等等。数据类型相关遇到了一些问题:解决办法大概是:但是对于我来说是无效的,最后还是照着下面来:成功......
  • OpenGL:混合
    OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(SolidColor)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻......
  • 下水道拾的沟槽的文章
    天色将晚,在我看着你的眼里色彩斑斓五月的气候合往年一样闷热,二中的晚自习太静,于是闲下来了,止不住地去向,好像又来一轮毕业的时候。小学时,谈起毕业总是很害怕的,那时觉得毕业时候一定是要大哭一场,不然就算不上毕业结果那天也如同流水一般平淡地过去了,正如过去的留个平淡的春秋,感慨一......
  • 极简 Python:10 段代码,学会基础 python
    前言:本篇共包含10段简单的Python,涉及常用语法和常用库(但毫无疑问删减了很多,比如没有字典)任何不懂的地方可直接留言~注:如果某个地方以 “#”开始意思是:这是注释一、数据类型涉及Python中最常用的基本数据类型及其操作包括数字、字符串和列表#数字操作a=10b......
  • 数据结构(C语言严蔚敏版)——第二章 线性表
    前言:    对这一章节的学习,我深有体会,只有把链表这一重点弄清楚,才算开始真正的正式学习数据结构,刚开始学习链表的朋友可能会感到有点绕脑,但是当你掌握链表以后,你会发现其实原来学习编程还是很有意思的,慢慢在学习中找到成就感,不断收获。   当然,这章的重点还是在......
  • 毫米波雷达阵列天线设计综合1(MATLAB仿真)
    1天线设计目标      毫米波雷达探测目标的距离、速度和角度,其中距离和角度和天线设计相关性较强。天线增益越高,则根据雷达方程可知探测距离越远;天线波束越窄,则角度分辨率越高;天线副瓣/旁瓣越低,则干扰越少,虚假目标越少。      天线的性能直接影响雷达性能,现代......
  • Spring AOP(实现,动态原理)详解版
    SpringAOP1.什么是AOP?1.1引入AOP依赖1.2编写AOP程序2.SpringAOP核⼼概念2.1切点(Pointcut)2.2连接点(JoinPoint)2.3通知(Advice)2.4切⾯(Aspect)3.通知类型3.1顺序3.2切⾯优先级@Order3.3⾃定义注解@MyAspect4.SpringAOP原理5动态代理怎么实现5.1JDK动......
  • 【Selenium+java环境配置】(超详细教程常见问题解决)
    Selenium+java环境配置windows电脑环境搭建-chrome浏览器1.下载chrome浏览器2.查看chrome浏览器版本3.下载chrome浏览器驱动4.配置系统环境变量PATH验证环境是否搭建成功1.创建java项目,添加pom文件中添加依赖2.编写代码运行常见问题&解决办法1.访问失败Theversio......
  • 网页设计与制作基础(HTML+CSS)
    HTML常用标签1、文档结构标签<!DOCTYPEhtml>:告诉浏览器文档是HTML5。<html>:HTML文档的根元素。<head>:包含文档的元数据,如标题、样式和脚本引用等。<title>:设置文档的标题,显示在浏览器的标签页上。<body>:包含文档的可见内容,如文本、图片、链接、列表、表格等。 <!DOCT......
  • P3756 [CQOI2017] 老C的方块 解题报告
    oj:https://gxyzoj.com/d/gxyznoi/p/P266又是网格题,考虑染色:显然可以发现,每一个不合法的图形都可以被染成黄->蓝->特殊边->绿->红,且旋转后同样满足条件推广到整个棋盘就是:所以是否可以将颜色编号,然后按照上述方法连边呢?显然是可以的,若一个格子被填上了方块,则讨厌的形状一定......