常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式。显然字面值属于常量表达式,用于表达式初始化的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. 在Navicat新建用户

    1.Ctrl+Q,进入查询,创建表空间. 输入create tablespace test datafile 'D:\Oracle\test.ora' size 1000m; 这里的test为表空间名 ...

  2. 学习CSS之用CSS绘制一些基本图形

    一.三角形 如下图,通过设置 border 的大小和颜色可以形成四个三角形: 上图对应的代码为: /* 三角形 */ .triangle {     width: 0;     height: 0; ...

  3. Python 语言规范(Google)

    Python语言规范 Lint tip 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less dy ...

  4. STM32,ARM,Keil工具相关

    One ELF Section per Function https://blog.csdn.net/iceiilin/article/details/6091575 因此,可以得出,选项One EL ...

  5. 1336 - Sigma Functio

    1336 - Sigma Function Sigma function is an interesting function in Number Theory. It is denoted by t ...

  6. xmake v2.3.1 发布, 无缝对接其他构建系统

    最近对xmake内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验. 项目源码 官方文档 一些新特性: 一键编译其他构建系统维护的项目,实现无缝对接,并且支持交叉编译(比如autotoo ...

  7. mongoose报错:DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

    mongoose报错:(node:15689) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes ...

  8. 珠峰-express

    ##### #### 中间件的作用 #### 自己写的Route方法 #### #### 中间件

  9. javascript中onclick(this)用法介绍

    this指触发事件的对象 代码如下: <input id="myinput" type="text" value="javascript中onc ...

  10. h5笔记1

    1.HTML中不支持 空格.回车.制表符,它们都会被解析成一个空白字符 2.适用于大多数 HTML 元素的属性: class 为html元素定义一个或多个类名(classname)(类名从样式文件引入 ...