constexper+const+常量表达式

2023-05-16

常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的 const 对象也是常量表达式。

一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如:

const int max_files = 20; // max_file是常量表达式

const int limit = max_file + 1; // limit是常量表达式

int staff_size = 27; // staff_size不是常量表达式

const int sz = get_size() // sz不是常量表达式

尽管 staff_size的初始值是个字面值常量,但由于它的数据类型只是一个普通int 而非 const int,所以它不属于常量表达式。另一方面,尽管 sz 本身是一个常量,但它的具体值直到运行时才能获取到,所以也不是常量表达式。

constexpr变量

在一个复杂系统中,很难(几乎肯定不能)分辨一个初始值到底是不是常量表达式。当然可以定义一个 const 变量并把它的初始值设为我们认为的某个常量表达式,但在实际使用时,尽管要求如此却常常发现初始值并非常量表达式的情况。可以这么说,在此种情况下,对象的定义和使用根本就是两回事儿。

C++11新标准规定,允许将变量声明为 constexpr 类型以便由编译器来验证变量的值是否是一个常量表达式。

声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式初始化

constexpr int mf = 20; // 20是常量表达式

constexpr int limit = mf + 1; // mf + 1是常量表达式

constexpr int sz = size(); // 只有当size是一个constexpr函数时才是正确的

尽管不能使用普通函数作为 constexpr 变量的初始值,但是新标准允许定义一种特殊的 constexpr 函数。这种函数应该足够简单以使得编译时就可以计算其结果,这样就能用 constexpr 函数去初始化 constexpr变量了。

一般来说,如果你认定变量是一个常量表达式,那就把它声明成 constexpr类型。

字面值类型

常量表达式的值需要在编译时就得到计算,因此对声明 constexpr 时用到的类型必须有所限制。因为这些类型一般比较简单,值也显而易见、容易得到,就把它们称为"字面值类型"(literal type)。

到目前为止接触过的数据类型中,算术类型、引用和指针都属于字面值类型。

自定义类 Sales_item、IO 库、string 类型则不属于字面值类型,也就不能被定义成 constexpr。

尽管指针和引用都能定义成 constexpr,但它们的初始值却受到严格限制。

一个 constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。

函数体内定义的变量一般来说并非存放在固定地址中,因此 constexpr指针不能指向这样的变量。

相反的,定义于所有函数体之外的对象其地址固定不变,能用来初始化 constexpr指针。允许函数定义一类有效范围超出函数本身的变量,这类变量和定义在函数体之外的变量一样也有固定地址。因此,constexpr 引用能绑定到这样的变量上,constexpr 指针也能指向这样的变量。

指针和constexpr

必须明确一点,在 constexpr明中如果定义了一个指针,限定符 constexpr仅对指针有效,与指针所指对象无关:

const int *p = nullptr; // p是一个指向整型常量的指针

constexpr int *q = nullptr; // p是一个指向整数的常量指针

p 和q的类型相差甚远,p 是一个指向常量的指针,而q是一个常量指针,其中的关键在于 constexpr 把它所定义的对象置为了顶层 const。

与其他常量指针类似,constexpr 指针既可以指向常量也可以指向一个非常量

constexpr int *np = nullptr; // np是一个指向整数的常量指针,其值为空 int j = 0;

constexpr int i = 42; // i的类型是整型常量 //i和j必须定义在函数体之外

constexpr const int *p = &i; // p是常量指针,指向整型常量i

constexpr int *p1 = &j; // p1是常量指针,指向整数j

 

编译器再编译过程中把const修饰的变量全都替换为值,而与此矛盾的是全局变量只能定义一次,其他地方只是声明,无法获取初值,为此设定了const对象只在文件内有效,然后所有用到它的文件全都重新赋值

共享const对象的方法:

1. 将const常量放在公共头文件中,直接包含头文件,相当于每个都有自己独立的定义

2. 将const对象的定义和声明处全都添加const修饰,即相当于强行添加const属性

一、const的引用

正常情况,引用的类型必须与其引用对象的类型保持一致,但初始化常量引用有两个例外

1. const int &a=42;  int a=2;const int&b=a*2;

2. double a=1.234;const int &b=a;

为啥? 因为在编译过程中,编译器会为a传建一个临时量对象

二、const和指针

指向常量的指针,即自以为指的是常量,自觉地不去改变它的值 int a=1;const int *b=&a;

记忆法:指针的类型即为指向对象的类型,如果对象类型是const int,则指针类型也得是const int

常量指针:指针本身是常量,即不允许修改指向的地址 int a=1;int *const b=&a;

三、常量表达式

字面值是常量表达式,有常量表达式初始化的cosnt对象也是常量表达式

const 和cosntexpr区别,后者必须保证在编译期就可以计算得出,前者则运行的时候即可

constexpr修饰指针时只表示该指针为常量指针,不代表指向常量,需要指向常量则定义为constexpr const int *b=&a;
 

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

constexper+const+常量表达式 的相关文章

  • 一篇文章完全讲解C语言指针

    https mp weixin qq com s biz 61 MzU3NDU5NDczMw 61 61 amp mid 61 2247504309 amp idx 61 5 amp sn 61 5421ee86fb1be92b43d99f
  • 读懂Adaptive Autosar架构-基础应用篇

    对于Adaptive AUTOSAR xff0c 咱们经常会看到这句话 xff1a Write once Adopt everywhere 但实际上理想很丰满 xff0c 现实很骨感 毕竟Classic Platform xff08 后面简
  • 软件架构的定义

    一 软件架构的定义 我们先讨论一下什么是软件架构 xff1f 对于软件架构并没有一个标准的定义 xff0c 但是你和软件工程师谈到架构的时候 xff0c 他们会知道这些都会是架构的内容 是不是要分层 xff0c 如何处理事件 xff0c 如
  • 一文了解V2X技术栈及其产业链

    C V2X会给未来出行交通带来怎样的改变 xff1f 会在哪些场景下发挥作用 xff1f 这条产业链里面的公司又是哪些 xff1f 大厂们在V2X上的投入又是如何呢 xff1f 本文可以给你一个答案 1 为什么需要V2X 随着C V2X及5
  • 精力管理分享

    你是否长时间工作却没有时间休息 是否总是感到压力很大 xff0c 时间不够用 xff1f 是否经常觉得很疲惫 xff0c 怎么调整都找不到状态 xff1f 然而 xff0c 不论是工作还是生活 xff0c 我们每个人都需要进行自我能量的调节
  • 目标管理

    业务能力很突出 xff0c 管理能力跟不上 xff0c 怎么办 xff1f 这节课帮你补全管理必修模块 xff0c 掌握全面的管理视角 学了很多管理手段 xff0c 总是用不上怎么办 xff1f 用工具统一管理语言 xff0c 拿来就能用
  • 深入浅出理解SOME/IP

    详解SOME IP协议文档 1 知乎 知乎 xff0c 中文互联网高质量的问答社区和创作者聚集的原创内容平台 xff0c 于 2011 年 1 月正式上线 xff0c 以 让人们更好地分享知识 经验和见解 xff0c 找到自己的解答 为品牌
  • SOME/IP-SD 深入浅出

    文章中 xff0c 我们了解了一条完整的SOME IP报文应该长什么样子 xff0c 但这显然是不够的 xff0c 至少还有以下这几个问题并没有得到明确的解决 xff1a Client如何发现服务 当服务不可用时 xff0c 如何通知Cli
  • Segmentation Fault错误原因总结

    一 什么是 Segmentation fault in Linux 所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间 xff0c 通常这个值是由gdtr来保存的 xff0c 他是一个48位的寄存器 xff0c 其中的32位是保存
  • 漫谈QNX(架构/进程,线程,同步,进程间通信IPC)

    1 架构 说起Blackberry的QNX操作系统 想必大家都听说过 xff0c 但到底为什么QNX能如此有名 xff1f 难道微软的Windows和Linux都不能与之抗衡 xff1f 美国NASA的太空接驳飞船也使用QNX操作系统 QN
  • Linux系统安装后需要做什么?

    安装完linux系统之后需要做的事情 以centos7为例 xff1a 1 用root用户登录 2 tab键补全安装包 yum span class token operator span y install bash span class
  • ETAS Adaptive AUTOSAR 自适应平台示例视频教程

    ETAS AP AUTOSAR自适应平台示例视频教程 本系列文章旨在提供一个详细的操作指南 xff0c 以构建ETAS AP AUTOSAR自适应平台的示例 实践练习的目标是加强AUTOSAR自适应平台中的理论概念 xff0c 并更好地理解
  • 什么是微内核,看这一篇就够了

    微内核是将服务转移到进程上的一种内核模式 宏内核是一种传统的内核结构 xff0c 它将进程管理 xff0c 内存管理等各项服务功能都放到内核中去 xff0c 通常用在通用式的内核上 xff0c 如unix xff0c linux等 两个系统
  • AUTOSAR的E2E通信安全

    AUTOSAR标准的安全通信为支持功能安全 xff0c AUTOSAR标准结合ISO 26262功能安全标准 xff0c 在基础软件层从安全执行 安全通信以及安全内建测试三个方面做出了规范 xff0c 并规范 AUTOSAR标准的安全通信
  • bridged networking(桥接模式)和network address translation(NAT模式)

    在NAT模式下 xff1a 王五的主机里面的虚拟机有一个虚拟的网卡有一个IP地址192 168 100 88 xff0c 可以在内部生成一个虚拟的地址192 168 100 xff19 xff19 与之通信 xff0c 然后通过代理利用主机
  • Linux 目录结构

  • Adaptive AUTOSAR 简介 (2021版)

    目录 1 Adaptive AUTOSAR 简介 Adaptive平台 一种新的 AUTOSAR 1 1 Adaptive的案例 1 2 经典平台与适应性平台的比较 1 3 单一系统 1 4 架构 逻辑架构 1 5 软件架构 本文图片来源
  • 从Adaptive AUTOSAR的角度看SOA

    前言 身处汽车行业的我们深知 xff0c 新技术的应用或者新概念的提出 xff0c 一定是事出有因的 通常是为了抢夺新技术高地 xff0c 让汽车更好地满足未来的需求 那么 xff0c 汽车电子电气架构领域掀起的这股SOA热潮是由什么导致的
  • 什么是BSP?理解LINUX BSP

    BSP 可支持操作系统更好地运行于硬件主板 BSP xff08 Board Support Package xff09 指板级支持包 对于一般的嵌入式系统 xff0c 硬件部分需要嵌入式硬件工程师设计硬件电路 xff0c 而新出厂的电路板需
  • c++11 std::move() 的使用

    std move函数可以以非常简单的方式将左值引用转换为右值引用 xff08 左值 左值引用 右值 右值引用 参见 xff1a http www cnblogs com SZxiaochun p 8017475 html xff09 通过s

随机推荐

  • Adaptive AUTOSAR 学习笔记 3 - AP 背景、技术及特征

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20 11 版本 本文从AUTOSAR EXP PlatformDesign pdf开始 xff0c 一边学习 xff0c 一边顺带着翻译一下 尽力而为 x
  • MySQL导入数据(命令行、脚本方式)

    docker安装MySQL并导入数据 安装步骤省略 xff0c 详细可参考百度上文档 一 命令方式 1 把数据传进服务器中 dfc span class token annotation punctuation 64 BBC span sp
  • Linux 终端快捷键

    Linux 终端快捷键 你可能会有这样的疑问 xff1a 对于有些快捷键 xff0c 明明有等效的 一个按键就能搞定的操作 xff0c 为什么非要舍近求远 用两个组合键来实现 xff1f 当对键盘 终端命令熟练到一定程度之后 xff0c 你
  • Adaptive AUTOSAR----Adaptive studio

    Adaptive studio Adaptive Studio 是包含在 RTA VRTE SK 中的 AUTOSAR 编辑器 Adaptive studio 通过高级抽象支持所有 adaptives autosar arxml 元素的配置
  • Linux tcpdump命令详解

    简介 用简单的话来定义tcpdump xff0c 就是 xff1a dump the traffic on a network xff0c 根据使用者的定义对网络上的数据包进行截获的包分析工具 tcpdump可以将网络中传送的数据包的 头
  • 什么是 E2E 保护 ?

    安全在每个领域都是一个永恒的话题 xff0c 汽车也不例外 xff0c 而随着最近几年汽车电动化 智能化和网联化的发展 xff0c 汽车安全也越来越受到用户及开发人员的重视 xff0c 安全的要素也是多方面的 xff0c 例如用户可能关心在
  • CAN总线基础

    概述 汽车电子设备的不断增多 xff0c 对汽车上的线束分布以及信息共享与交流提出了更高的要求 传统的电气系统往往采用单一连接的方式通信 xff0c 这必将带来线束的冗余以及维修的成本的提高 单一布线连接 传统的单一通信的对接方式 xff0
  • 说一说LIN总线

    前几天小编画点时间看了一些关于LIN总线基础的内容 xff0c 把其中的关键点提取了出来 xff0c 在这里分享给大家 在这里你可能要问 不都有CAN总线了吗 xff1f 这个LIN总线又是从哪里来的 xff1f 其实理由很简单 xff0c
  • CAN FD 介绍

    随着电动汽车 xff0c 无人驾驶汽车技术的快速发展 xff0c 以及对汽车高级驾驶辅助系统和人机交互HMI需求的增加 xff0c 传统的CAN总线在传输速率和带宽等方面越来越显得力不从心 xff0c 其主要原因如下 xff1a 1 通常整
  • FlexRay 介绍

    汽车上的总线技术包括 xff1a LIN CAN CAN FD FlexRay MOST及Ethernet xff0c 我们之前已经分享了LIN xff0c CAN CAN FD总线 在开始阅读之前 xff0c 如果你对已介绍的总线技术还不
  • FlexRay总线原理及应用

    由于传统的CAN解决方案不能满足汽车线控系统 xff08 X by Wire xff09 的要求 于是在 2000 年 9 月 xff0c 宝马和戴姆勒克莱斯勒联合飞利浦和摩托罗拉成立了 FlexRay 联盟 该联盟致力于推广 FlexRa
  • SENT信号介绍

    Vehicle攻城狮 The people who are crazy enough to think they can change the world are the ones who do SENT背景介绍 提到车载总线 xff0c
  • Linux 日志管理

    常用日志文件 系统日志是由一个名为syslog的服务管理的 xff0c 如以下日志文件都是由syslog日志服务驱动的 xff1a var log boot log xff1a 录了系统在引导过程中发生的事件 xff0c 就是Linux系统
  • SPI 通讯协议

    Cuitbasics 汽车ECU设计 2 2 当您将微控制器连接到传感器 xff0c 显示器或其他模块时 xff0c 您是否考虑过这两种设备是如何相互通信的 xff1f 他们到底在说什么 xff1f 事实上电子设备之间的通信就像人类之间的交
  • UART串口通讯

    UART代表通用异步接收器 发送器也称为串口通讯 xff0c 它不像SPI和I2C这样的通信协议 xff0c 而是微控制器中的物理电路或独立的IC UART的主要目的是发送和接收串行数据 xff0c 其最好的优点是它仅使用两条线在设备之间传
  • 一文搞懂AUTOSAR的DEM模块

    Dem全称为Diagnostic Event Manager xff0c 负责故障事件的处理 故障数据的存储和管理 简单说其功能是故障事件确认前的故障debounce xff0c 故障事件确认时的故障数据存储 xff0c 故障发生后的故障老
  • linux父子进程问题——孤儿进程与僵尸进程[总结]

    今天遇到一个linux进程启动时指定Max open files不对的问题 xff0c 导致程序建立socket异常 xff0c 进而导致fullgc问题 xff0c 影响正常服务 所以顺带又温习了下linux下的父子进程的特性 孤儿进程与
  • C++11/14/17一些好用新特性自己整理下

    1 override xff1a 子类继承父类的时候 xff0c 子类虚函数名字写错了或者参数列表不匹配会变成另外一个函数编译器无法判断对错 xff0c 和你写不写virtual也没关系 xff0c 这时候可以在虚函数结尾加上overrid
  • vector中emplace_back方法的用途

    在写代码的过程中 xff0c CLion提醒我把 span style background color ffd900 push back span 方法替换成 span style background color ffd900 empl
  • constexper+const+常量表达式

    常量表达式 xff08 const expression xff09 是指值不会改变并且在编译过程就能得到计算结果的表达式 显然 xff0c 字面值属于常量表达式 xff0c 用常量表达式初始化的 const 对象也是常量表达式 一个对象