constexpr和常量表达式
常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式。
字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定:
const int max_files = ;//max_files是常量表达式
const int limit = max_files + ;//limit是常量表达式
int staff_size = ;//staff_size不是常量表达式
const int sz = get_size();//sz不是常量表达式
尽管staff_size的初始值是个字面值常量,但由于它的数据类型只是一个普通int而非const int,所以它不属于常量表达式。
sz本身是一个常量,但是它的值直到具体运行的时候才能获取到,所以也不是常量表达式。
constexpr变量
c++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf = ;//20是常量表达式
constexpr int limit = mf + ;//mf+1是常量表达式
constexpr int sz = size();//只有当size()是一个constexpr函数时才是一条正确的声明函数
如果认定一个变量是一个常量表达式,那就把它声明成constexpr类型。
字面值类型
- 算是类型、引用和指针都属于字面值类型。
- 一个constexpr指针的初始值必须是nullptr或0,或者是存储于某个固定地址中的对象。
- 函数体内定义的变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量。
指针和constexpr
在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,与指针所指对象无关:
const int *p = nullptr;//p是指向一个整型常量的指针
constexpr int *q=nullptr//q是一个指向整数的常量指针
p和q的类型相差甚远,p是一个指向常量的指针,q是一个常量指针,其中constexpr把它所定义的对象置为了顶层const。
与其他指针类似,constexpr指针既可以指向常量也可以指向一个非常量:
constexpr int *np = nullptr;//np是一个指向整数的常量指针
int j = ;
constexpr int i = ;//i的类型是整数常量
//i和j都必须定义在函数体之外
constexpr const int *p = &i;//p是常量指针,指向整型常量i
constexpr int *p1 = &j;//p1是一个常量指针,指向整数j
constexpr和常量表达式的更多相关文章
- constexpr与常量表达式(c++11标准)
关键字 constexpr 是C++11中引入的关键字,是指值不会改变并且在编译过程中就得到计算结果的表达式.(运行中得到结果的不能成为常量表达式,比如变量). 声明为constexpr的变量一定是一 ...
- const限定符、constexpr和常量表达式------c++ primer
编译器将在编译过程中把用到const变量的地方都替换成对应的值,为了执行这种替换,编译器必须知道变量的初始值.如果程序包含多个文件,则那个用了const对象的文件都必须能访问到它的初始值才行.要做到这 ...
- c++nullptr(空指针常量)、constexpr(常量表达式)
总述 又来更新了,今天带来的是nullptr空指针常量.constexpr(常量表达式)C++的两个用法.Result result_fun = nullptr;constexpr stati ...
- constexpr和常量表达式的注意事项
1.常量表达式,是指其值不可改变,且在编译阶段就已经得出计算结果的表达式,例如字面值就是常量表达式. 2.判断是否是常量表达式,要关注数据类型是否是const类型,初始值是否是在编译阶段就得到的. 3 ...
- 10、初识constexpr和常量表达式
常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.显然字面值属于常量表达式,用于表达式初始化的const对象也是常量表达式. 1.判断一个变量是不是常量表达式 一个对象(表达式)是不是 ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- C++11 constexpr常量表达式
常量表达式函数 要求: 函数体内只有单一的return返回语句 例如: constexpr int data() { const int i=1; //含有除了return以外的语句 return i ...
- 常量表达式和constexpr(c++11)
常量表达式 常量表达式是指值不会改变且在编译阶段就能得到计算结果的表达式(两点要求) ; //是常量表达式 ; //是常量表达式 "; const int siz=s.size(); //不 ...
- 常量表达式 & constexpr
[常量表达式] 一个这样的表达式:值不会改变 && 在编译过程中就能够得到计算结果 常见的常量表达式:字面值.用常量表达式初始化的const对象 一个对象是不是常量表达式由它的数据类型 ...
随机推荐
- bigdata learning unit two--Spark environment setting
1.下载 Spark安装之前的准备 文件的解压与改名 tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz rm -rf spark-2.2.0-bin-hadoop2.7. ...
- JDBC调用MySQL的调用过程CallableStatement
调用过程可以当作函数理解,具体参考本人博文https://www.cnblogs.com/xixixing/p/9720261.html MySQL的test数据库中已经创建好存储过程p2(n),实现 ...
- IntelliJ IDEA载入JDBC驱动包
1.下载zip格式的驱动包:https://dev.mysql.com/downloads/connector/j/ 2.解压zip,放到任意位置.其中的mysql-connector-java.ja ...
- HTML学习笔记Day7
一.position定位属性,检索对象的定位方式 1.语法:{position:static(无特殊定位)/absolute(绝对定位)/relative(相对定位)/fixed(固定定位):} 1) ...
- Linux中sed的用法实践
Linux中sed的用法实践 参考资料:https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html http://www.fn139 ...
- 关于mac 系统如何通过终端 连接linux服务器 并传文件!
首先要打开终端 mac远程链接服务器 输入 : ssh root@xxx.xx.xxx.xx xxx.xx.xxx.xx是端口号 后面会要求你输入password 即可远程连接 mac通过终端给 ...
- mac 安装pip
mac 安装pip报错 bogon:~ root# sudo easy_install pip Searching for pip Reading https://pypi.python.org/si ...
- python 第一类对象 闭包 迭代器
########################总结########################### 1. 函数名 -> 第一类对象 函数名就是变量名. 函数可以赋值 函数可以作为集合类的 ...
- 谈谈关于PHP连接数据库的两种方法(PDO&Mysqli)
前言:在我们之前学习sql语句的时候都是停留在黑窗口的,怎样才能让mysql与程序代码发生联系呢?此时PDO和Mysqli应运而生,为了解决这个问题 (一)开启其中(pdo或者mysqli)的php扩 ...
- Github/github 初始化教程
注: 由于将项目迁移到gitee,克隆gitee 的时候出现了问题.不得已,重新配置 ref : https://blog.csdn.net/jingtingfengguo/article/detai ...