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

1、判断一个变量是不是常量表达式

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

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

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

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

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

解释:

尽管staff_size的初始值是字面常量,但是由于他的数据类型只是一个普通int而不是const int,所以它不属于常量表达式。

另一方面,尽管sz本身是一个常量,但他的具体值直到运行时才能获取到,所以也不是常量表达式。

2、判断一个变量的初始值是否为一个常量表达式

在一个复杂的系统中我们很难辨别一个初始值是不是一个常量表达式。

c++11标准规定,允许将变量声明为constexpr类型,让编译器验证这个变量的初始值是不是一个常量表达式。

这里强调一点,constexpr是用来验证变量的初始值是不是一个常量表达式。例如:

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

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

constexpr int sz = size();                 // 只有size()是一个constexpr函数时,才是一条正确的声明语句

尽管普通函数不能作为constexpr变量的初始值,但是新规允许一种特殊的consrexpr函数,这种函数必须足够简单使得编译器编译时就可以计算结果。这样就能用constexpr函数去初始化constexpr变量。

3、constexpr与指针

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

必须明确一点,constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

const int *p = nullptr;

constexpr int *p1 = nullptr;

//////////////////////////////////////////////////////////////

constexpr  const int *p = &i;

constexpr int *p1 = &j;

这里要说明一下,i和j都必须要定义在函数外面。

10、初识constexpr和常量表达式的更多相关文章

  1. constexpr与常量表达式(c++11标准)

    关键字 constexpr 是C++11中引入的关键字,是指值不会改变并且在编译过程中就得到计算结果的表达式.(运行中得到结果的不能成为常量表达式,比如变量). 声明为constexpr的变量一定是一 ...

  2. const限定符、constexpr和常量表达式------c++ primer

    编译器将在编译过程中把用到const变量的地方都替换成对应的值,为了执行这种替换,编译器必须知道变量的初始值.如果程序包含多个文件,则那个用了const对象的文件都必须能访问到它的初始值才行.要做到这 ...

  3. c++nullptr(空指针常量)、constexpr(常量表达式)

    总述     又来更新了,今天带来的是nullptr空指针常量.constexpr(常量表达式)C++的两个用法.Result result_fun = nullptr;constexpr stati ...

  4. constexpr和常量表达式

    常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式. 字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式. 一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同 ...

  5. constexpr和常量表达式的注意事项

    1.常量表达式,是指其值不可改变,且在编译阶段就已经得出计算结果的表达式,例如字面值就是常量表达式. 2.判断是否是常量表达式,要关注数据类型是否是const类型,初始值是否是在编译阶段就得到的. 3 ...

  6. 常量表达式和constexpr(c++11)

    常量表达式 常量表达式是指值不会改变且在编译阶段就能得到计算结果的表达式(两点要求) ; //是常量表达式 ; //是常量表达式 "; const int siz=s.size(); //不 ...

  7. C++常量表达式、const、constexpr(C++11新增)的区别

    常量表达式是指值不会改变且在编译过程中就能够得到计算结果的表达式,能在编译时求值的表达式. 程序先编译再运行:  在编译阶段, 编译器将在编译过程中把用到该常量的地方都全都替换为 常量的值. 但是常量 ...

  8. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  9. C++11 constexpr常量表达式

    常量表达式函数 要求: 函数体内只有单一的return返回语句 例如: constexpr int data() { const int i=1; //含有除了return以外的语句 return i ...

随机推荐

  1. WeChall_Enlightment (Encoding)

    解题: 刚开始一看这题就蒙逼了,完全没思路,过了几天后再仔细去想想,应该是二进制的ascii码,但是原来的三张图虽然都是8的倍数,但完全转换不成有用的东西,题目的意思能否找到光,百度了一下关于三原色的 ...

  2. Java并发读书笔记:如何实现线程间正确通信

    目录 一.synchronized 与 volatile 二.等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 三.等待通知典型 生产者消费者模型 ...

  3. DRF框架的安装与使用

    目录 DRF框架的安装与配置 基于restful接口规范的接口设计 DRF框架的安装与配置 """ 1)安装 >: pip install djangorestfr ...

  4. Go语言实现:【剑指offer】从上往下打印二叉树

    该题目来源于牛客网<剑指offer>专题. 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 不需分层,一维数组. Go语言实现: /** * Definition for a bi ...

  5. 来看看你对Python变量理解到位了没有

    变量是编程的基础概念,Python 的变量也看似很简单,但是如果理解不当,生搬硬套,可能会遇到一些麻烦. 下面用 10 个代码示例展示 Python 的 变量 本质. 以下内容有对应的 视频 手把手详 ...

  6. package.json(node)中,多个命令行合并一条

    1. ‘&’ 并行执行顺序,同时执行 "dev":"node test.js & webpack" 2.'&&'继发顺序,执行前 ...

  7. Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新

    使用Spring Cloud Config我们能实现服务配置的集中化管理,在服务启动时从Config Server获取需要的配置属性.但如果在服务运行过程中,我们需要将某个配置属性进行修改,比如将验证 ...

  8. linux中权限管理命令(chmod/chown/chgrp/unmask)

    目录 chmod chown chgrp umask chmod 解释 命令名称:chmod 命令英文原意:change the permissions mode of a file 命令所在路径:/ ...

  9. mysql--容器无法启动

    mysql服务总是在重启状态 查看mysql容器日志 # docker logs 镜像名称 InnoDB: If this error appears when you are creating an ...

  10. springboot无法访问静态资源

    无法访问static下的静态资源 1.在application.yml中添加 resources: static-locations: classpath:/META-INF/resources/,c ...