C++:常量表达式

C++11开始constexpr作为一种声明,为编译器提供了在编译期间确认结果的优化建议,满足部分编译期特性的需求

constexpr和const区别

int b=10;
const int a=b;
//运行成功
constexpr int c=b;
//编译器报错,b的值在编译期间不能确定
const int size1(){return 100;}
constexpr int size2(){return 100;}
char buf1[size1()];//报错
char buf2[size2()];//通过

constexpr修饰的变量它的值必须在编译阶段可以确认,const只是作为常类型。

对constexpr修饰的函数的约束(C++11)

  • 函数必须有一个返回值即返回值类型不能是void
  • 函数体内只能有一行用于输出返回值且返回值必须是常量表达式
  • 函数必须定义且必须用constexpr声明

注意:即使定义了一个常量表达式函数,如果形参不是常量表达式的话函数会退化为普通函数

字面类型(常量表达式中所有类型必须是字面类型)

  • 构造函数用constexpr声明
  • 构造函数初始化参数列表里是常量表达式
  • 构造函数的函数体为空
  • 基本数据类型、指针、引用、各种字面量都是字面类型

C++ 14标准规则:

  • 函数体允许声明初始化过的变量,除了static和thread_local变量
  • constexpr不在具有const属性
  • 开始支持部分代码如:if,switch,各种循环
  • 可以修改字面类型数据
  • 返回值可以是void了

C++17开始lamada表达式可以用constexpr声明时会进行隐式声明

char *buf[[](){return 1024;};];

C++17 提出了if constexpr,它可以根据一个常量表达式的返回结果有选择的编译部分代码,可以简化模板的编写,比如:特化的实现

template <typename T>
void printSize(T value) {if constexpr (std::is_integral<T>::value) {std::cout << "Size of integral type: " << sizeof(T) << " bytes" << std::endl;} else if constexpr (std::is_floating_point<T>::value) {std::cout << "Size of floating-point type: " << sizeof(T) << " bytes" << std::endl;} else {std::cout << "Size of other type: " << sizeof(T) << " bytes" << std::endl;}
}

C++20 标准

  • 支持constexpr虚函数
  • 运行在constexpr中进行一些默认初始化
  • 支持try catch和typeid,dynamic_cast等运算符的使用

constexpr相关关键字

  • consteval关键字,强制编译期出结果,得不到结果程序结束(C++ 20)
  • constinit关键字,用于具有静态存储持续时间的(生命周期全局)变量声明上,他要求变量具有常量初始化程序(编译阶段初始化),某种程度上可以提高程序效率

应用:
封装static_assert的参数,STL中sort源码中快排部分判断比较器是否有效时,将比较对象的顺序调换看比较结果是否是否不同,所以使用sort时比较器必须是常量表达式函数
在这里插入图片描述

STL中sort的源码中插入排序部分就用到了常量表达式用于判断迭代器的种类,如果是线性迭代器使用memmove直接移动数据,否则就需要使用循环一个一个的移动对象,这里不详细的说明了,有时间的化会写一篇博客讲一下sort源码
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试笔记系列二之java基础+集合知识点整理及常见面试题

目录 Java面向对象有哪些特征&#xff0c;如何应用 Java基本数据类型及所占字节 Java中重写和重载有哪些区别 jdk1.8的新特性有哪些 内部类 1. 成员内部类&#xff08;Member Inner Class&#xff09;&#xff1a; 2. 静态内部类&#xff08;Static Nested Class&#…

Vue 组件和插件:探索细节与差异

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

Linux查看进程占用句柄

ps -ef |grep python # 查找工具执行PID python pid 11287lsof -p 11287 |wc -l 查看进程占用句柄设置句柄上限IOError: [Errno 24] Too many open files:解决方法

阿里云短信验证笔记

1.了解阿里云的权限操作 进入AccessKey管理 选择子用户 创建用户组和用户 先创建用户组&#xff0c;建好再进行权限分配 添加短信管理权限 创建用户 创建好后的id和密码在此处下载可以得到 2.开通阿里云短信服务 进行申请&#xff0c;配置短信模板 阿里云短信API文档 短信服务…

逆向案例三:动态xhr包中AES解密的一般步骤,以精灵数据为例

补充知识&#xff1a;进行AES解密需要知道四个关键字&#xff0c;即密钥key,向量iv,模式mode,填充方式pad 一般网页AES都是16位的&#xff0c;m3u8视频加密一般是AES-128格式 网页链接:https://www.jinglingshuju.com/articles 进行抓包结果返回的是密文&#xff1a; 一般思…

【算法大家庭】分治算法

目录 &#x1f953;1.简单介绍 &#x1f9c8;2.汉诺塔问题 1.简单介绍 分治算法是解决问题的一种思想&#xff0c;它将一个大问题分解成若干个小问题&#xff0c;然后分别解决这些小问题&#xff0c;最后将小问题的解合并起来得到原问题的解。 分解&#xff1a;将原问题分解…

Mazing官方 2.17.17版新i功能介绍

iMazing官方 2.17.17版是一款管理苹果设备的软件&#xff0c;是一款帮助用户管理 IOS 手机的PC端应用程序&#xff0c;能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;功能…

SD-WAN对云服务的影响

近年来&#xff0c;随着企业对云服务的依赖不断增加&#xff0c;SD-WAN技术成为提升连接性能的热门选择。SD-WAN通过简化云集成和连接&#xff0c;以及提升应用程序性能&#xff0c;为企业带来显著的业务优势。这种云连接的改进使企业能够更轻松地接触全球劳动力和潜在客户。 首…

语文专刊《中学语文》是什么级别的刊物?

语文专刊《中学语文》是什么级别的刊物&#xff1f; 《中学语文》创刊于1958年&#xff0c;由国家新闻出版总署批准&#xff0c;经湖北省教育厅主管的省级学术期刊。 《中学语文》是由湖北大学文学院主办、国内外公开发行的学术期刊&#xff0c;主要面向中学语文教师和语文教…

盘点:好用的伪原创文章生成器软件

伪原创文章生成器软件在内容创作域领应用的非常广泛&#xff0c;它不仅可以为创作人员解决文章或文案创作困难的问题&#xff0c;同时还可以作为提升创作效率的完美工作&#xff0c;然而随着互联网技术的发展&#xff0c;互联网上的伪原创文章生成器软件多到让人应接不暇&#…

echarts鼠标事件

鼠标事件支持方法 ECharts 支持常规的鼠标事件类型&#xff0c;包括 ‘click’、 ‘dblclick’、 ‘mousedown’、 ‘mousemove’、 ‘mouseup’、 ‘mouseover’、 ‘mouseout’、 ‘globalout’、 ‘contextmenu’ 事件 简单实例 // 基于准备好的dom&#xff0c;初始化EChar…

加州大学圣地亚哥分校伯克利分校联合英伟达最新开源!COLMAP-Free 3D Gaussian Splatting

作者&#xff1a;石昊 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 从图像序列中进行相机姿态估计和新视角合成的问题。…

论文笔记:A survey on zero knowledge range proofs and applications

https://link.springer.com/article/10.1007/s42452-019-0989-z 描述了构建零知识区间证明&#xff08;ZKRP&#xff09;的不同策略&#xff0c;例如2001年Boudot提出的方案&#xff1b;2008年Camenisch等人提出的方案&#xff1b;以及2017年提出的Bulletproofs。 Introducti…

Win11系统实现adb命令向安卓子系统安装APP

Win11系统实现通过adb命令向安卓子系统安装已下载好的apk包。 要实现以上目标&#xff0c;我们需要用到一个Android SDK 的组件Android SDK Platform-Tools &#xff01;这个组件呢其实是被包含在 Android Studio中的&#xff0c;如果你对安卓开发有所了解对此应该不会陌生&…

【Unity】如何在Unity 中创建带有缩放效果的滚动视图(具有吸附效果的实现与优化)?

效果预览&#xff1a; 目录 效果预览&#xff1a; 一、引言&#xff1a; 二、问题描述 三、解决方案&#xff1a; 三、优化&#xff1a; 四、结论 一、引言&#xff1a; 在Unity开发中&#xff0c;经常需要实现滚动视图&#xff08;ScrollView&#xff09;中的内容吸附到…

算法C++

枚举 1.化段为点 前缀和 eg:给一个数列&#xff0c;算x到y个数的和 #include <iostream> #include <vector> using namespace std;int main() {int n;cin>>n;vector<int> a(n);vector<int> sum(n1,0);for(int i0;i<n;i){scanf…

047-WEB攻防-PHP应用文件上传函数缺陷条件竞争二次渲染黑白名单JS绕过

047-WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过 #知识点&#xff1a; 1、PHP-原生态-文件上传-检测后缀&黑白名单 2、PHP-原生态-文件上传-检测信息&类型内容 3、PHP-原生态-文件上传-函数缺陷&逻辑缺陷 4、PH…

Window系统部署Z-blog并结合内网穿透实现远程访问本地博客站点

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Spring Task的应用

介绍 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a; 定时任务框架 作用&#xff1a; 定时自动执行某段Java代码 应用场景&#xff1a; 引用卡每月还款提醒、银行贷款每月还款提醒、火车票售票系统处理未支…

文献速递:深度学习--应用深度学习到DaTscan SPECT图像以改善帕金森病运动结果预测

文献速递&#xff1a;深度学习–应用深度学习到DaTscan SPECT图像以改善帕金森病运动结果预测 Title 题目 Improved motor outcome prediction in Parkinson’s disease applying deep learning to DaTscan SPECT images 应用深度学习到DaTscan SPECT图像以改善帕金森病运动…