consexpr关键字和常量表达式
来源:互联网 发布:qq免费刷赞软件下载 编辑:程序博客网 时间:2024/05/22 12:02
常量表达式
常量表达式的定义:
- 是指值不会改变并且在编译过程中就能得到计算结果的表达式。
常量表达式的种类:
字面值是常量表达式
用常量表达式初始化的const对象也是常量表达式
常量表达式举例:
const int max_files = 20; //max_files是常量表达式const int limit = max_files + 1; //limit是常量表达式int staff_size = 27; //staff_size不是常量表达式
constexpr变量
constexpr变量:
constexpr是C++11新标准规定的规定的关键字。有时我们很难分辨一个初始值是不是常量表达式,当然可以定义一个 const变量并把它的初始值设为我们认为的某个常量表达式,但在实际使用时,尽管要求如此却常常发现初始值并非常量 表达式的情况。可以说,这时的对象的定义与使用根本就是两回事。
C++11新标准规定,允许将变量声明为constexpr类型让编译器来验证变量的值是否是一个常量表达式(如果不是,编译器会报错)。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf = 0; // 0 是常量表达式 constexpr int limit = mf + 1; // mf + 1 是常量表达式 constexpr int sz = size(); // 只有当 size() 是一个constexpr函数时才是一条正确的声明语句
constexpr函数
定义:
constexpr函数是指能用于常量表达式的函数。定义constexpr函数的方法与其他函数类似,不过要遵循几项约定:函数的返回类型以及所有形参的类型都得是字面值类型(关于字面值类型:http://blog.csdn.net/capecape/article/details/78016750),而且函数体内必须有且只有一条return语句:
constexpr int new_sz() { return 42;}constexpr int foo = new_sz(); //正确:foo是一个常量表达式
执行该初始化时,编译器把对constexpr函数的调用替换成其结果值。为了能在编译过程中随时展开,constexpr函数被隐式地指定为内联函数。
总结
使用constexpr的好处:
是一种很强的约束,更好的保证程序的正确定语义不被破坏;
编译器可以对constexper代码进行非常大的优化,例如:将用到的constexpr表达式直接替换成结果
相比宏来说没有额外的开销。
总而言之,使用constexpr的目的是为了保证该变量或函数是一个常量表达式,如果不是,编译器会报错。
- consexpr关键字和常量表达式
- 常量和常量表达式
- const 关键字和常量
- constexpr和常量表达式
- constexpr和常量表达式
- constexpr和常量表达式
- constexpr和常量表达式
- constexpr和常量表达式
- 语法、关键字和常量变量
- postgres关键字、常量和数据类型
- namespace关键字和__NAMESPACE__常量
- [C++] constexpr和常量表达式
- 常见字符串常量和表达式
- C++ Special:const关键字和常量指针 vs 指针常量
- 91. PHP namespace关键字和__NAMESPACE__常量
- C++学习:const关键字和常量
- Unit3 标识符、数据类型、常量变量和关键字
- Java中的变量、常量、关键字和标识符
- linux
- LTE系统上行链路调度算法研究
- Arcgis Javascript API 开发笔记
- 运算符重载
- idea常用快捷键
- consexpr关键字和常量表达式
- Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充
- 手机网站中 拨打电话代码
- [RK3288][Android6.0] GPU DVFS控制策略小结
- java 求100000以内的相亲数
- 解决 MySQL 与 Elasticsearch 数据不对称问题
- Python中re(正则表达式)模块学习
- JAVA线程之ReentrantLock源码分析(一)
- POJ 2686 Traveling by Stagecoach