const 和 constexpr 深入学习

在 C++ 中,const 和 constexpr 都可以用来修饰对象和函数。修饰对象时,const 表示它是常量,而 constexpr 表示它是一个常量表达式。常量表达式必须在编译时期被计算1。修饰函数时,const 只能用于非静态成员的函数,而 constexpr 可以用于含参和无参函数。constexpr 函数适用于常量表达式,只有在下面的情况下编译器才会接受 constexpr 函数:

  1. 函数体必须足够简单,除了 typedef 和静态元素,只允许有 return 语句。如构造函数只能有初始化列表,typedef 和静态元素(实际上在 C++14 标准中已经允许定义语句存在于 constexpr 函数体内了)。
  2. 参数和返回值必须是字面值类型。

常量表达式的概念如下:

  • 必须是可以在编译阶段被识别的。比如模版的参数/数组的大小。
  • constexpr 修饰某物并不保证它一定在编译时被计算,也可以在运行时被计算。
  • 不用 constexpr 也可能是一个常量表达式,如 const int N = 3; int num [N] = {1,2,3,};N 在声明时初始化,满足常量表达式的标准,虽然没用 constexpr

所以,到底什么时候用 constexpr?像上面的 N,虽然没有用 constexpr 仍然是一个常量表达式。事实上,const 本身和它的枚举类型若在声明时初始化那么就是一个常量表达式。在函数中若有常量表达式那么必须用 constexpr,仅仅满足常量表达式的条件是不够的。

所以,constconstexpr 的主要区别在于:

  • const 变量的初始化可以延迟到运行时,而 constexpr 变量必须在编译时进行初始化。
  • const 变量可以通过 const_cast 类型转换来修改值,而 constexpr 是不可以修改的。可以将 const 理解为只读变量更符合其含义。
  • const 只能用于非静态成员函数,而 constexpr 可以和成员、非成员、构造函数一起使用。

我们来深入学习代码


int fun(int x) {

	return x;
}

constexpr int ff(int x) {

	return x;
}

int main()
{
	
	int x = 10;
	const int a = x;
	constexpr int b = x;  // 错误的 表达式 必须是常量
	constexpr int c = fun(10);   // 也是错误的
	constexpr int d = ff(10);   // 正确的
	constexpr int d = ff(x);   // 错误的
}

 

  1. const int a = x; 是正确的,因为 a 是一个常量,可以被赋值为一个变量。

  2. constexpr int b = x; 是错误的,因为 x 不是常量表达式,而 constexpr 变量必须在编译时求值为常量表达式。

  3. constexpr int c = fun(10); 是错误的,因为 fun(10) 返回的不是常量表达式。在 constexpr 上下文中,函数的返回值必须是常量表达式。

  4. constexpr int d = ff(10); 是正确的,因为 ff(10) 返回的是常量表达式。

  5. constexpr int e = ff(x); 是错误的,因为 x 不是常量表达式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Secure Software Lifecycle Management (SSLM)安全软件生命周期管理

文章目录 前言一、现代理念二、安全的软件生命周期管理总结 前言 The concept of integrating security into the software development process is not new. While I cannot definitively assert that Microsoft was the pioneer of this concept, the Secure Development Li…

清理docker Build Cache缓存文件

使用docker构建镜像,发现docker的overlay2文件会越来越大。 使用命令查看docker系统占用资源: docker system df 可以看到已经占用了26.7GB,清理这个缓存 docker builder prune 再次查看,已经没有缓存了,清理成功。 …

【UE】中文字体 发光描边材质

效果 步骤 1. 先将我们电脑中存放在“C:\Windows\Fonts”路径下的字体导入UE 点击“全部选是” 导入成功后如下 2. 打开导入的“SIMSUN_Font”,将字体缓存类型设置为“离线” 点击“是” 这里我选择:宋体-常规-20 展开细节面板中的导入选项 勾选“使用距…

Redis缓存淘汰策略

Redis缓存淘汰策略 1、各种面试题 生产上你们的redis内存设置多少?如何配置、修改redis的内存大小如果内存满了你怎么办?redis清理内存的方式?定期删除和惰性删除了解过吗?redis缓存淘汰策略有哪些?分别是什么?你用哪个?redis的LRU了解过吗?请手…

FastApi接收不到Apifox发送的from-data字符串_解决方法

接收不到Apifox发送的from-data字符串_解决方法 问题描述解决方法弯路总结弯路描述纵观全局小结 问题描述 这里写了一个接口,功能是上传文件,接口参数是file文件和一个id字符串 gpt_router.post("/uploadfiles") async def create_upload_fi…

基于ora2pg迁移Oracle19C到postgreSQL14

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

linux socket套接字

文章目录 socket流socket(TCP)数据报socket(UDP) 讨论 socket 所谓套接字,就是对网络中不同主机上的应用程序之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,套接字提供了应用层进程利…

AI - FlowField(流场寻路)

FlowField流场寻路,利用网格存储每个点对目标点的推力,网格上的单位根据对于推力进行移动。用于大量单位进行寻路对于同一目的地的寻路,常用于rts游戏等。 对应一张网格地图(图中黑块是不可行走区域) 生成热度图 计算所有网格对于目标点(…

【Flutter】graphic图表实现tooltip一段时间后自动隐藏

概述 graphic图表中提供了自定义tooltip的事件,可通过selections中on和clear配置手势选项和可识别设备,默认情况下tooltip需要双击隐藏,但这并不符合我们的需求。通过调研发现,若想实现tooltip隔几秒后隐藏,可通过Str…

西工大网络空间安全学院计算机系统基础实验一(9, 10, 11, 12, 13)

还是那句话,专心做好你自己的,老老实实把基础打好,不要被其他人带跑节奏,不要跟他打,跟着这系列博客,稳扎稳打一步一步来。即使你VMware workstation没下载好,即使你Ubuntu虚拟机没配好&#xf…

【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第三次作业

Written Part 1. 基于表 1 1 1 回答下列问题(min_sup40%, min_conf75%): Transaction IDItems Bought0001{a, d, e}0024{a, b, c, e}0012{a, b, d, e}0031{a, c, d, e}0015{b, c, e}0022{b, d, e}0029{c, d}0040{a, b, c}0033{a, d, e}0038…

【计算机网络笔记】交换机

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

Vue3依赖注入

适用场景 尤其针对一个变量需要从顶层组件开始透传,途径很多个子组件最后在第n代子组件使用的时候。对于这些途经的子组件而言,它们不但不使用而且完全不关心该变量具体是什么,只是作为一个传递工具罢了。这种情况下,使用依赖注入…

asla四大开源组件应用示例(alsa-lib、alsa-utils、alsa-tools、alsa-plugins)

文章目录 alsa设备文件/dev/snd//sys/class/sound/proc/asoundalsa-lib示例1alsa-utilsalsa-toolsalsa-plugins参考alsa设备文件 /dev/snd/ alsa设备文件目录位于,/dev/snd,如下所示 root@xboard:~#ls /dev/snd -l total 0 drwxr-xr-x 2 root root 60 Nov 6 2023 …

vuepress-----7、发布在GitHub

# 7、发布在GitHub 在你的项目中,创建一个如下的 deploy.sh 文件(请自行判断去掉高亮行的注释): #!/usr/bin/env sh# 确保脚本抛出遇到的错误 set -e# 生成静态文件 npm run docs:build# 进入生成的文件夹 cd docs/.vuepress/dist# 如果是发…

PTA_2023年软件设计综合实践_10(回溯法与分治限界法)

7-1 桥本分数 将1-9九个数不重复地赋给不同的9个元素 ,实现形如a/bcd/eff/hi 的形式。例:1/265/784/39 1/325/967/84 (注意:1/265/784/39 和5/781/264/39 只能算一种解),共有多少种不同的解。 语言选C #…

36 - 电商系统表设计优化案例分析

如果在业务架构设计初期,表结构没有设计好,那么后期随着业务以及数据量的增多,系统就很容易出现瓶颈。如果表结构扩展性差,业务耦合度将会越来越高,系统的复杂度也将随之增加。这一讲我将以电商系统中的表结构设计为例…

服务器数据恢复—V7000存储raid5崩溃导致上层卷无法使用的数据恢复案例

服务器数据恢复环境: 某品牌V7000存储中有一组由几十块硬盘组建的raid5阵列。上层操作系统为windows server,NTFS分区。 服务器故障: 有一块硬盘出现故障离线,热备盘自动上线替换离线硬盘。在热备盘上线同步数据的过程&#xff0c…

【springboot】idea项目启动端口被占用

问题 idea本地启动springboot项目端口老是被占用 解决 关闭被占用的端口进程 步骤: 1. winR打开程序框 2. 查出被占用端口的进程id netstat -ano | finderstr 端口号 例如 netstat -ano | finderstr 81013.杀死进程 taskkill /pid 进程id -t -f 例如 taskkill /pid 2…

TZOJ 1369 求绝对值

答案&#xff1a; #include<stdio.h> int main() {double a0.0; 要求输入实数&#xff0c;实数包括小数&#xff0c;所以不能用int&#xff0c;只能用浮点型doublewhile (scanf("%lf", &a) ! EOF) //多组数据输入{if (a < 0.0) //如果是负数a -a…
最新文章