常量表达式,是指值不会变并且在编译的时候就已经能够计算出结果的表达式。
字面值属于常量表达式,用常量表达式初始化的const变量也是常量表达式。
一个对象是或不是常量表达式,要根据他的数据类型和初始值共同决定!
int a = 42;
const int b = size();
上面的a和b都不是常量表达式!不过b要想是常量表达式的话只要满足size()是constexpr函数就行!
constexpr变量
声明为constexpr的变量一定是一个常量!而且必须要用常量表达式进行初始化!
constexpr int a = 20;
const int limit = a+2;
constexpr只对指针有效,也即是说,constexpr声明的指针是指针的顶层const。也就是说,指针是常量指针,那究竟它所指向的值是否是常量那就不确定了!constexpr指针是常量指针,不能指向定义在函数体内的变量!因为这些变量一般来说并非存在固定地址中
int a = 42;
constexpr int* op = &a;
a是普通变量,值为42,op是常量指针,op指向a;
constexpr int b = 32;
constexpr int* ok = b;
b是常量表达式,值为32,ok是常量指针,指向常量b;
constexpr函数
函数的返回值和参数类型都必须是字面值类型(指针,引用,算术类型)
函数体中必须只能有一条return语句;
constexpr int size_ss() {return 42;}
constexpr int a = size_ss(); //正确
隐式被声明为内联函数。可以多次定义,为了保持多个定义的完全一致!所以定义在头文件中