有点难理解权且记住,使用才会体会其中真正的差别。

常量表达式的概念:在编译期就可以计算出结果的表达式。
那么为什么要用常量表达式呢,用常量表达式会有什么好处:
1.允许一些计算只在编译时进行一次,而不是每次程序运行时;
2.编译器可以进行尺度更大的优化;
3.可以用在需求编译期间常量的上下文,例如数组长度等;

使用constexpr修饰变量时:
const 变量的初始化可以延迟到运行时,而 constexpr 变量必须在编译时进行初始化。
所有constexpr对象都是const的,但是不是所有的const对象都是constexpr的。

对constexpr函数的基本要求:
1. 常量表达式函数必须有返回值(不可以是void函数)
2.常量表达式函数体中只能有一条语句,且该语句必须是return语句。(可以使用?:、递归)但不产生实际代码的语句可以在常量表达式函数中使用,如static_assert,using,typedef等(这条规定在C++14中大幅放松)
3.return语句中,不能使用非常量表达式的变量、函数,且return的表达式也要是常量表达式
4.常量表达式函数在使用前,必须有定义。(普通函数在被调用前只要有函数声明就够了,不一定有定义)

常量构造函数的要求:
1.成员变量只能通过初始化列表来初始化,函数体必须为空
2.初始化列表只能由常量表达式来赋值

常量成员函数的要求:
常量成员函数被隐式定义为const成员函数,不可以通过常量成员函数去修改成员变量。也就是说,常量成员函数往往是所谓的getter函数。(c++14则不同,允许constexpr成员函数去修改成员变量)
常量成员函数不能是virtual的

在C++11与C++14的区别:
在C++11标准中,对于constexpr修饰的函数给了及其苛刻的限定条件:函数的返回值类型及所有形参的类型都是字面值类型,而且函数体内必须有且只有一条return语句。
这个条件显然是太苛刻了,以至于很多在constexpr的操作都要借助?:表达式,递归等办法实现。
在C++14中,放宽了这一限定,只保留了“函数的返回值类型及所有形参的类型都是字面值类型”,也就是说,这些值都在编译期能确定了就行。

constexpr与const的本质区别
const主要用于表达“对接口的写权限控制”,即“对于被const修饰的量名(例如const指针变量),不得通过它对所指对象作任何修改”。
(但是可以通过其他接口修改该对象)。另外,把对象声明为const也为编译器提供了潜在的优化可能。
具体来说就是,如果把一个量声明为const,并且没有其他地方对该量作取址运算,那么编译器通常(取决于编译期实现)会用该量的实际常量值直接替换掉代码中所有引用该量的地方,而不用在最终编译结果中生成对该量的存取指令。

constexpr的主要功能则是让更多的运算可以在编译期完成,并能保证表达式在语义上是类型安全的。
(译注:相比之下,C语言中#define只能提供简单的文本替换,而不具任何类型检查能力)。
与const相比,被constexpr修饰的对象则强制要求其初始化表达式能够在编译期完成计算。之后所有引用该常量对象的地方,若非必要,一律用计算出来的常量值替换。

能否同时使用constexpr与const?
对于变量来讲,一般情况下constexpr已经包含了const的语义,所以没必要同时使用;但是也有特殊情况:

static constexpr int N = 3;
int main()
{constexpr const int *NP = &N;return 0;
}

在这里const和constexpr在修饰不同的东西,constexpr和const都必须要有。constexpr表示NP指针本身是常量表达式,而const表示指向的值是一个常量。去掉const之后无法编译,因为不能用正常指针指向常量。
对于成员函数来讲,在C++11中constexpr同样包含const的含义,但是C++14中则不,所以C++14中可能会需要同时使用const与constexpr。

作者:丑角的晨歌
链接:https://www.jianshu.com/p/461daaac16af
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
————————————————
版权声明:本文为CSDN博主「宁静以致墨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baiyibin0530/article/details/89348517

constexpr函数相关推荐

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

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

  2. [C++]constexpr函数

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

  3. [C/C++] constexpr函数

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

  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. mysql在线上建索引,mysql 5.6在线DDL建索引测试
  2. 2018-3-3 论文(网络评论中非结构化信息的表示与应用研究)笔记一
  3. 删除文件夹右键下的部分目录
  4. cad立面索引符号 规范_一套标准规范施工图包含哪些?13年深化设计师3分钟带你正确认知...
  5. Educational Codeforces Round 94 (Rated for Div. 2)
  6. 利用工厂模式实现怪物系统
  7. git merge 回退_Git 基础学习总结2(学不会你锤我)
  8. [转]C#读写TEXT文件
  9. minheight能继承吗_遗嘱中的房屋被拆迁,指定继承人能继承对应的拆迁款或安置房吗?...
  10. arcgis 属性表中起点终点创建线_【ArcGIS开发】shapefile矢量数据遍历、求交、与属性更新...
  11. doubango播放不均匀的问题及改进办法
  12. SQLite: 注意日期查询中的“前空格”问题将引发错误查询!
  13. 【数字信号调制】Matlab实现PCM编码和QAM调制
  14. Unity_雷达篇以及TUIO协议的使用。
  15. Layabox的2d精灵的性能优化
  16. SpringCloud:Gateway网关配置及使用
  17. 【全是干货!伸手党福利】通过银行卡号判断出所属银行信息
  18. seo优化策略有哪些?
  19. Win10休眠文件更改存储位置
  20. 基金从业考试各科目难度特点?

热门文章

  1. 3D人脸识别预处理,3D face recognition preprocess
  2. 个人阅读 代码大全的阅读与提问
  3. 更新部分字段 NHibernate
  4. Access数据库注入
  5. [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解
  6. [LeetCode] Palindrome Number Valid Palindrome - 回文系列问题
  7. 搜索引擎和知识图谱那些事 (上).基础篇
  8. App设计灵感之十二组精美的手机闹钟App设计案例
  9. python入门常用代码
  10. 那些藏在你键盘里的emoji,背后到底有着怎样的故事?