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

  1. const int max_num = 20; // max_num是常量表达式

  2. const int limit = max_num + 1; // limit 是常量表达式

  3. int staff_size = 2; // staff_size 不是常量表达式,因为staff_size没有用const修饰

  4. const int zs = get_size(); // sz 不是常量表达式,虽然sz是个常量,但它的值在运行时才能确定

可见:一个对象(或表达式)是不是常量表达式由它的数据类型(是否const)和初始值共同决定。

constexpr(const expression):

const可以用来修饰常量,可是只有当其初始值是个常量表达式时,const修饰的对象才是个常量表达式。C++11 提出了 constexpr 用于定义常量表达式。一般而言,如果你认定变量是一个常量表达式,那就把它声明成 constexpr 类型。constexpr 变量在定义时必须初始化.

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

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

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

指针和 constexpr:

当 constexpr 修饰指针时,constexpr 仅对指针有效,与指针所指的对象无关:

  1. const int *p = nullptr; // p 是指向常量的指针

  2. constexpr int *q = nullptr; // q 是常指针,constexpr 仅对指针有效

当然,const 和 constptr 可以一起来修饰一个指针,用于表明指向常量的常指针。

constexpr const int *p = &i;    // 指向常量的常指针,注意 &i 必须是常量表达式,i可以是全局变量或静态变量等等。。这些变量的地址在编译时就确定了

constexpr函数:

constexpr函数是指能用于常量表达式的函数。不同于一般函数,constexpr 函数的返回值类型及所有形参的类型都是字面值类型(算术类型,引用,指针等属于字面值类型),而且函数体中有且只有一条 return 语句。为了能在编译过程中随之展开,constexpr函数被隐式地指定为内联函数。constexpr 函数的返回值在编译时就能被确定。

我们允许 constexpr 函数不一定返回常量表达式,但是我们认为:

  1. // 如果 arg 为常量表达式,则 scale(arg)也是常量表达式

  2. constexpr size_t scale(size_t cnt) { return 2 * cnt;}

举例:

  1. #include <iostream>

  2. constexpr size_t scale(size_t cnt) {

  3. return 2 * cnt;

  4. }

  5. int main () {

  6. constexpr size_t sz;

  7. constexpr size_t s = 3;

  8. sz = scale(s);

  9. std::cout << sz << std::endl;

  10. return 0;

  11. }

可见,constexpr 函数不一定返回常量表达式,但是在 scale(3) 可以在编译时确定。

[C/C++] constexpr函数相关推荐

  1. constexpr函数

    有点难理解权且记住,使用才会体会其中真正的差别. 常量表达式的概念:在编译期就可以计算出结果的表达式. 那么为什么要用常量表达式呢,用常量表达式会有什么好处: 1.允许一些计算只在编译时进行一次,而不 ...

  2. C++ 11 新特性: constexpr变量和constexpr函数

    constexpr变量 字面值类型包括算术类型.引用.指针.枚举和数据成员都是字面值类型的聚合类. 聚合类的定义: 所有成员都是public的.     没有定义任何构造函数.     没有类内初始值 ...

  3. [C++]constexpr函数

    constexpr函数(constexpr function)是指能用于常量表达式的函数.定义constexpr函数的方法与其他函数类似,不过要遵循几项约定:函数的返回类型及所有形参的类型都得是字面值 ...

  4. 《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数

    1.返回指向数组/函数的指针 顾名思义,就是函数返回值为指向数组/函数的指针. 数组的性质:不能被拷贝,函数也不能返回数组.但可以返回数组指针/引用,声明一个返回数组指针的函数,有四种方式,一种是直接 ...

  5. C++中constexpr函数

    1 简介 constexpr函数指的是在编译的时候就能得到其返回值的函数,也就是说编译器将constexpr函数直接转换成其返回值,因此,constexpr函数都是被隐式地定义为内联函数.使用cons ...

  6. constexpr 函数 “qCountLeadingZeroBits“ 不会生成常数表达式

    Fix MSVC2017 compilation with enabled relaxed constexpr on 32-bit target qt 的bug  ,按照下列地址修改源码 https: ...

  7. c++ 函数 -函数重载 -特殊用途的语言特性(默认实参,内联函数 ,constexpr ,assert,NDEBUG)

    c++ 函数 -函数重载 -特殊用途的语言特性 文章目录 c++ 函数 -函数重载 -特殊用途的语言特性 函数重载 定义: 重载和const形参 const_cast 和重载 const_cast 重 ...

  8. C++11 constexpr使用

    C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...

  9. C++Primer学习——函数

    编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...

最新文章

  1. android 自定义命名空间,Android自定义ActionBar实例
  2. 安装完python后、还需要安装什么-安装python后
  3. Firefox扩展开发 Hello World!
  4. /proc/irq和/proc/interrupts详解
  5. 纯JS实现省市县三级下拉联动
  6. jsp中两个字符串格式的日期可以相减吗_举个栗子!Tableau 技巧(126):学几个常用的日期函数...
  7. 这次来个BGP反射器的简单小实验
  8. Spring MVC 验证码
  9. linux内核驱动工作队列用法
  10. JavaScript语言精粹--执行环境及作用域,this
  11. 魅族魅蓝5s详细开启Usb调试模式的流程
  12. 解决了MovieClip缩略图问题
  13. 华创e路航固件_华创e路航地图升级工具 v1.0 官方版(图文)
  14. swift 图片压缩
  15. 信托公司的“大数据”战略思维
  16. html页面div的显示/隐藏
  17. 有了手机远程控制手机的软件,在家突然收到工作任务也不怕
  18. matlab中匿名(Anonymous)函数及bsxfun函数
  19. android handler的机制和原理_Android完整知识体系路线(菜鸟-资深-大牛必进之路)
  20. mybatis-plus QueryWrapper 添加limit

热门文章

  1. 下一代Asp.net开发规范OWIN(3)—— Middleware
  2. .Net 应用框架设计系列(二)
  3. [原创 URL重写步骤
  4. python安全编程基础内容
  5. Python之每个人都应该知道的30个一行代码程序
  6. HarmonyOS之深入解析视频的功能和使用
  7. 面试官,求你了别再问我TCP三次握手和四次挥手了(含面试题)
  8. 《数据库原理与应用》(第三版)第2章 数据模型与数据库结构 习题参考答案
  9. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1107:校门外的树
  10. Andy's First Dictionary