一、常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式。一个对象是不是常量表达式是由它的数据类型和初始值共同决定。

 int staff_size = ;//虽然初始值是字面值常量,但是它的数据类型只是普通int。
const int sz = get_size(); //虽然sz本身是常量,但是它的具体值直到运行时才能获取到所以也不是常量表达式

二、constexpr变量

  将变量声明成为constexpr类型,声明为constexpr类型的变量一定是一个常量,且必须使用常量表达式初始化。

 constexpr int mf = ;    //20是常量表达式
constexpr int sz = size(); //只有当size()是一个constexpr函数时,才是一个正确的声明语句。

三、constexpr函数

  constexpr函数可以用于初始化constexpr变量,其函数的返回类型以及所有形参的类型都是字面值类型且函数体中有且只有一条return语句。且constexpr函数和被隐式的指定为内联函数。

 //编译器在程序编译时可以验证new_sz返回的是常量表达式,所以可以用new_sz的返回值初始化constexpr变量foo
constexpr int new_sz() {return ;}
constexpr int foo = new_sz(); //foo是一个常量表达式

  另外我们允许constexpr函数的返回值并非一个常量:如果实参是常量表达式,那么函数返回值也是常量表达式

  //当scale的实参是常量表达式时,其返回值也是常量表达式 constexpr size_t scale(size_t cnt){return new_sz() * cnt} 

 四、再来介绍下字面值类型

算术类型、引用、指针、字面值常量类、枚举类型都是字面值类型。而其他自定义类、IO库、STL库都不属于字面值类型。尽管指针和引用能被定义为constexpr,但是他们的初始值要受到严格限制。一个constexpr指针的初始值必须是nullptr或0,或者时存储于某个固定地址中的对象:比如全局变量或者局部静态变量

  1、介绍下指针这个字面值类型:限定符constexpr只对指针有效,与指针所指对象无关。

 const int *p = nullptr;  //p是一个指向整型常量的指针
constexpr int *p = nullptr;//p是一个指向整数的常量指针
//在于constexpr把它所定义的对象置成了鼎城const,与下面这个一样了。
int *const p ; //p是一个常量指针,指向整数
//既然ocnstexpr是常量指针,那么它既能指向常量也能指向非常量。 int j =;
constexptr int i = ; constexpr const int *p = i; //p是常量指针,指向整型常量
constexpr int *p1 = j; //p1也是常量指针,指向整数j //注意:i和j必须要定义在函数体之外,即必须是存储在某个固定地址的对象。

  2、再介绍下字面值常量类

数据成员是字面值类型的聚合类是字面值常量类。符合下述要求的类也是字面值常量类:

  1. 数据成员都是字面值类型
  2. 类必须至少含有一个constexpr构造函数,这样的函数必须符合constexpr函数的所有要求,他们是隐式const的
  3. 如果一个数据成员含有类内初始值,则内置数据成员的初始值必须是一条常量表达式;如果成员属于某种类类型,则初始值必须使用成员自己的constexpr构造函数
  4. 类必须使用析构函数的默认定义,该成员负责销毁类的对象。

虽然构造函数不能是const的(因为当我们创建类的一个const对象时,只有构造函数完成初始化过程,对象才真正可以取得常量属性),但是字面值常量类的构造函数可以是constexpr.

 class Debug{
public:
//constexpr的构造函数必须初始化所有数据成员,初始值使用constexpr构造函数或者是一条常量表达式。
constexpr Debug (bool b = ture):hw(b),io(b),other(b){}
constexpr Debug(bool h,bool i,bool o):
hw(h),io(i),other(o){}
cosntexpr bool any() {return hw||io||other;}
void set_io(bool b) { io = b;}
void set_hw(bool b) { hw = b;}
void set_other(bool b){ other = b;}
private:
bool hw;
bool io;
bool other; }

  3.再介绍下枚举类型

C++包括两种枚举:限定作用域和不限定作用域的。

C++之constexpr的更多相关文章

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

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

  2. [c++] constexpr and literal class

    稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++?   2. int i; // not constant const ...

  3. C++之内联函数与constexpr

    inline 函数 规模小,流程直接且频繁调用 cout<<shortString(s1,s2)<<endl; = cout<<(s1.size()<s2.s ...

  4. Item 15: 只要有可能,就使用constexpr

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果说C++11中有什么新东西能拿"最佳困惑奖" ...

  5. c++基础 - constexpr

    const expression常量表达式,指值不会改变,并且在编译过程中就能得到计算结果的表达式. 复杂系统难以分辨一个初始值是否是常量表达式,因此提出constexptr以提示编译器,用来验证变量 ...

  6. constexpr和常量表达式

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

  7. 【C++】C++中const与constexpr的比较

    先说结论相同点:const和consexpr都是用来定义常量的.不同点:const声明的常量,初始值引用的对象不一定是一个常量:constexpr声明的常量,初始值一定是常量表达式. constexp ...

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

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

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

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

  10. c++ 11 游记 之 decltype constexpr

    title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:130 ...

随机推荐

  1. org.apache.hadoop.hbase.master.HMasterCommandLine: Master exiting java.lang.RuntimeException: HMaster Aborted

    前一篇的问题解决了,是 hbase 下面lib 包的jar问题,之前写MR的时候加错了包,替换掉了原来的包后出现另一问题:@ubuntu:/home/hadoop/hbase-0.94.6-cdh4. ...

  2. MySQL在Win10与Ubuntu下的安装与配置

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     近段时间把自己电脑(win).虚拟机(Ubun ...

  3. python#父与子的编程之旅#第十四章

    1. 为BankAccount 建立一个类定义.它应该有一些属性,包括账户名(一个字符串).账号(一个字符串或整数)和余额(一个浮点数),另外还要有一些方法显示余额.存钱和取钱. class Bank ...

  4. C语言指针和数组

    #include <stdio.h> int main() { /********************************************* * * 指针和数组: * 定义 ...

  5. 《代码大全2》读书笔记 Week4

    <代码大全2>第8章:防御式编程 防御式编程的主要思想是子程序应该不因为非法的输入值被破坏,就好比开车时的防御式驾驶:你无法预估其他司机将会做什么,但你要采取措施保证当他人做出危险动作时自 ...

  6. D3.js 动画 过渡效果 (V3版本)

    一 . 过渡的启动   启动过渡效果,与以下四个方法相关:   d3.transition([selection],[name]) //创建一个过渡对象.但是由于每个选择集中都有transition( ...

  7. day02 mysql基本语句 存储引擎 数据类型 完整性约束

    day02 mysql   一.sql的基本语句     系统数据库         information_schema: 虚拟库, 不占磁盘空间(在内存汇中): 存的是数据库启动后的一些参数, 如 ...

  8. Java设计模式思想(单列模式,工厂模式,策略模式)

    a) 单例模式:单例模式核心只需要new一个实例对象的模式,比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加 ...

  9. python_django_urls模块与views模块请求访问过程

    diango接收到web请求后的在urls模块与views模块进行的过程操作: 匹配过程: urls拿到网址,在项目级urls中匹配,若在urlpatterns中存在,则跳转到应用级urls中匹配,若 ...

  10. 10.Struts2值栈

    1.什么是值栈 * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlValueSta ...