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

声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int i=;
constexpr int j=i+;
constexpr int k=f(); //只有f()是一个constexpr函数时k才是一个常量表达式

一般来说,若果一旦认定变量是一个常量表达式,那就把它声明为constexpr类型

常量表达式机制是为了:

1、提供了更多的通用的值不发生变化的表达式
2、允许用户自定义的类型成为常量表达式
3、提供了一种保证在编译期完成初始化的方法(可以在编译时期执行某些函数调用)

语义上:
constexpr:告诉编译器我可以是编译期间可知的,尽情的优化我吧。
const:告诉程序员没人动得了我,放心的把我传出去;或者放心的把变量交给我,我啥也不动就瞅瞅。

语法上:
constexpr是一种比const 更严格的束缚, 它修饰的表达式本身在编译期间可知, 并且编译器会尽可能的
evaluate at compile time. 在constexpr 出现之前, 可以在编译期初始化的const都是implicit
constexpr. 直到c++ 11, constexpr才从const中细分出来成为一个关键字, 而 const从1983年 c++
刚改名的时候就存在了

csdn论坛上看见大神的一段短话,摘录下来,很值的体会

constexpr:不光是可以取代模板是某些常量的表达更简洁,其实一个决定性的作用是支持地址类常量。这恰好补上了模板缺失的部分。比如有一个字符串常量"abc",很自然的可以认为其中的元素也是常量地址,对一个有编译期内容的常量地址取值理论上可以在编译器确定结果,但实际上按旧语法却不能直接拿去做为常量使用而是当作变量。

constexpr与常量表达式(c++11标准)的更多相关文章

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

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

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

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

  3. constexpr和常量表达式

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

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

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

  5. 10、初识constexpr和常量表达式

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

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

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

  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. 常量表达式和constexpr(c++11)

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

随机推荐

  1. 【面试】iOS 开发面试题(二)

    1. 我们说的oc是动态执行时语言是什么意思? 答案:多态. 主要是将数据类型的确定由编译时,推迟到了执行时. 这个问题事实上浅涉及到两个概念.执行时和多态. 简单来说.执行时机制使我们直到执行时才去 ...

  2. V-rep学习笔记:机器人模型创建2—添加关节

    下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...

  3. 安装lr时无法将值Disable Script Debugger 写入注册表

    1. 运行“regedit”打开注册表编辑器. 2. 右键点击权限.HKEY_CURRENT_USER-Softwart-Microsoft-Internet Explorer-Main 3. 勾选e ...

  4. 微软的在线文档存储OneDrive使用帮助

    onedrive默认空间5G,对于一般的文档存储够用的,很方便不限速!!! ###官方介绍 https://support.office.com/zh-cn/article/%E4%BA%86%E8% ...

  5. Linux命令行监控网口流量

    1.ifconfig [网卡名] ifconfig eth0 . 2. /proc/net/dev cat /proc/net/dev . 3. 使用watch命令配合 ifconfig, cat / ...

  6. iOS UIButton 图片文字左右互移 位置对调 解决方案

    实现类似效果: 代码实现: btnGrade.titleEdgeInsets = UIEdgeInsetsMake(, -(btnGrade.imageView?.bounds.width)!, , ...

  7. 个人常用eclipse快捷键,不定期更新

    ctrl+f11 ==> runctrl+h ==> 全文检索main+enter ==>public static void main(String[] args) { } alt ...

  8. IOC 之深入理解 Spring IoC

    在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...

  9. IIS状态监测(如果状态错误则重启IIS)

    步骤: 1:建立健康监测文件.文件内容随意,这里以healthcheck.aspx命名,内容是<span>hellow word</span> 2:利用vbs语言执行IIS重启 ...

  10. win7系统总是安装不了net2.0的解决方法

    一些网友询问说ghost win7系统总是安装不了net2.0怎么办呢?net2.0是什么?ATI显卡的控制中心 就需要在NET2.0的基础上.可是一些用户说win7系统总是安装不了net2.0如何解 ...