consexpr关键字和常量表达式
2017-09-22 09:31
148 查看
常量表达式
常量表达式的定义:是指值不会改变并且在编译过程中就能得到计算结果的表达式。
常量表达式的种类:
字面值是常量表达式
用常量表达式初始化的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的目的是为了保证该变量或函数是一个常量表达式,如果不是,编译器会报错。
相关文章推荐
- SQLSERVER出错提示:此上下文中不允许使用''。此处只允许使用常量、表达式或变量。不允许使用列名。
- core java 1~4(HelloWorld & 标识符|关键字|数据类型 & 表达式|流程控制 & 数组)
- 黑马程序员——Java基础——关键字、常量、变量、运算符
- 黑马程序员 Java基础<一> 关键字、常量变量、数据类型
- {php 初学头疼问题之:变量、常量关键字}
- C#(ASP.NET)正则表达式 过滤危险字符函数代码 防SQL注入 很全面的SQL关键字过滤
- error C2057: 应输入常量表达式
- Java 基本语法(关键字、标识符、常量、注释)
- 表达式必须是常量表达式
- 第三章 3.1数据类型,运算符与表达式 3.2.1常量和符号常量
- 常用正则表达式及关键字高亮显示方法
- RDLC 报表参数、常量及常用表达式的使用方法(上)
- JS使用正则表达式实现关键字替换加粗功能示例
- java中的switch语句 和 常量表达式
- 黑马程序员——C基础——关键字、常量、变量、运算符
- 【JavaScript】JavaScript基础-基本数据类型与常量和关键字
- 黑马程序员——Java基础语法(一)---关键字、常量、变量、运算符
- 【02】常用关键字,常量和变量,运算符,判断语句
- 【学习笔记】JavaScript——变量、常量、保留字、运算符与表达式、语句
- Java基础语法(一)(标识符,关键字,注释,常量,变量,基本数据类型)