constexpr与常量表达式(c++11标准)
2024-08-25 03:08:21
关键字 constexpr 是C++11中引入的关键字,是指值不会改变并且在编译过程中就得到计算结果的表达式。(运行中得到结果的不能成为常量表达式,比如变量)。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int i=;
constexpr int j=i+;
constexpr int k=f(); //只有f()是一个constexpr函数时k才是一个常量表达式
一般来说,若果一旦认定变量是一个常量表达式,那就把它声明为constexpr类型
常量表达式机制是为了:
1、提供了更多的通用的值不发生变化的表达式
2、允许用户自定义的类型成为常量表达式
3、提供了一种保证在编译期完成初始化的方法(可以在编译时期执行某些函数调用)
语义上:
constexpr:告诉编译器我可以是编译期间可知的,尽情的优化我吧。
const:告诉程序员没人动得了我,放心的把我传出去;或者放心的把变量交给我,我啥也不动就瞅瞅。
语法上:
constexpr是一种比const 更严格的束缚, 它修饰的表达式本身在编译期间可知, 并且编译器会尽可能的
evaluate at compile time. 在constexpr 出现之前, 可以在编译期初始化的const都是implicit
constexpr. 直到c++ 11, constexpr才从const中细分出来成为一个关键字, 而 const从1983年 c++
刚改名的时候就存在了
csdn论坛上看见大神的一段短话,摘录下来,很值的体会
constexpr:不光是可以取代模板是某些常量的表达更简洁,其实一个决定性的作用是支持地址类常量。这恰好补上了模板缺失的部分。比如有一个字符串常量"abc",很自然的可以认为其中的元素也是常量地址,对一个有编译期内容的常量地址取值理论上可以在编译器确定结果,但实际上按旧语法却不能直接拿去做为常量使用而是当作变量。
最新文章
- websevice中runtime modeler error: Wrapper class com.ws.jaxws.Add is not found问题的解决办法
- MyEclipse常用插件使用教程
- java 关于多线程高并发方面
- 2016 - 1 - 23 xml解析 -- 语法简介
- php xdebug xampp eclipse
- PHP 中的数组
- Hadoop学习之编译eclipse插件
- 记一次-angular-数字格式化
- Codeforces #377 Div2
- MongoDB的CURD命令
- 动态sql与静态sql的区别
- 介绍一个比较了各种浏览器对于HTML5 等标准支持程度的网站
- #004 C语言大作业学生管理系统试着做
- [tool] google搜索的正确使用姿势(待补全)
- protobuf使用简介
- BonnMotion支持的几种移动模型
- 恢复Intellij idea删除的文件
- 创建型模式之Builder(建造者)模式
- 五:理解控件的运行机制(例:基于Control命名空间的简单控件)
- MBR:主引导记录:
热门文章
- Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)
- yii框架的部署方法
- cpu高 load 高 内存高 io 高怎么排查
- 【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)
- python之模块pprint之常见用法
- C# 向指定的进程发送消息
- SG 函数初步 HDU 1536 &;amp;&;amp; HDU 1944
- [转] 利用BLKTRACE分析IO性能
- SSD 为什么顺序写比随机写性能更好?
- [转]awesome-tensorflow-chinese