常量表达式
如果在编译阶段就能知道确切值,就是常量表达式,一部分const语句是,不是全部。
const int ci = 42; //是
const int ci2 = ci+1; //是
int j = 1; //不是,就不是一个常量
const int size = getSize(); //不是,运行时期才能确定
constexpr
1.作用
验证是否是常量表达式,不是就报错
#include <iostream>
using namespace std;
const int getSize()
{
return 0;
}
int main() {
constexpr int ci = 42; //是
constexpr int ci2 = ci+1; //是
int j = 1; //不是,就不是一个常量
constexpr int size = getSize(); //xxx,报错
return 0;
}
字面值类型
1.如何判断
可以和constexpr结合的都是,算数类型,指针和引用是,自定义类不是
2.修饰指针和引用
指向的对象必须具有固定地址,就是编译时就确定地址,普通的局部变量不行,static还行
constexpr和指针
修饰的是指针本身,位置就只能放最前面
constexpr int* constexpr p2 = nullptr; //xxx,错了,不认可那个位置
一个有意思的对比
只能放外面才是常量表达式
#include <iostream>
using namespace std;
const int i =42; //放这里q那句才对
int main() {
constexpr int* p2 = nullptr;
constexpr const int *q = &i;
return 0;
}
放main里面,constexpr指针不认。'& i' is not a constant expression。
#include <iostream>
using namespace std;
int main() {
constexpr int* p2 = nullptr;
const int i =42; //这里i是局部变量,编译期地址不定
constexpr const int *q = &i; //xxx,不认可&i是常量表达式
return 0;
}