constexpr和常量表达式
常量表达式是指不会改变并且在编译过程中就能够得到计算结果的表达式。
一个对象(或表达式)是不是常量表达式由他的数据类型和初始值共同决定的
声明的为constexpr的变量一定是一个常量,而且必须用常量表达式初始化
const int a=20; //a是常量表达式
const int b=a+20; //b是常量表达式
int c=20; //c不是常量表达式;数据类型不是const int
const int d=getsize(); //d不是常量表达式; 具体值只能运行时才能获取,不是常量表达式
constexpr变量
C++11新规定,允许将变量声明为constexpr类型,以便由编译器来验证变量值是否是一个常量表达式。
(目前还不知道有什么用,感觉就是为了在编译阶段就识别函数返回是否是常量)
唯一的作用可能就是可以判断一个函数是否是常量表达式,从而用于初始化常量
常量表达式函数需要满足几个条件,否则不能用constexpr关键字进行修饰:
- 函数只能包含return语句。
- 函数必须有返回值。
- 在使用前必须已经定义。
- return返回语句中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式。
constexpr int number1(){ return 5; } //正确
constexpr int number2(){ int a; return 5; } //错误,不能有其他表达式
constexpr int number3(){ return ; } //错误,无返回值
int a = 10; constexpr int number4(){ return a; } //错误,a不是常量
字面值类型
常量表达式的值需要在编译时就得到计算,因此对声明constexpr时用到的类型必须有所限制。因为这些类型一般比较简单,值也显而易见、容易得到,就把它们称为“字面值类型”
指针和constexptr
const int *p=nullptr; //p是一个指向整形常量的指针
constexpr int *q=nullptr; //q是一个指向整数的常量指针
p是一个指向常量的指针,而q是一个常量指针。
原因是因为constexpr把他所定义的对象置为了顶层const(类似于*const q)。