C++11——constexpr

一、常量表达式

常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式。

例如:

const int a = 10;//a就是一个常量表达式
const int b = a +1;//b也是一个常量表达式
int c = 0;//c不是常量表达式,c的值可以改变
const int sz = get_size();//不是常量表达式,因为get_size()函数需要在运行阶段才能得到结果

二、constexpr 变量

  • 在一个复杂系统中,我们很难分辨一个一个初始值到底是不是常量表达式。我们可能认为只要定义了const的变量就是常量表达式了,但并不是这样的,就像上面那个第四个表达式就不是常量表达式。

  • C++11新标准规定,允许变量声明为constexpr类型以便编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int mf = 10;//10是常量表达式,所以mf也是常量表达式
constexpr int lm = mf+1;//mf+1是常量表达式
constexpr int sz = size();//size()不是常量表达式,所以sz 就不是常量表达式,就会报错。

如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。

三、指针和constexpr

  • 必须明确一点,在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针本身有效,与指针所指向的对象无关。
const int *p = 10;//p是一个指向整型常量的指针,不可以修改p指向的值,但可以改变p的值来改变地址。
constexpr int *q = nullptr;//q是一个指向整型的常量指针,可以改变它所指向的值,但不可以改变其地址。
  • 和其他常量指针类似,constexpr指针也可以指向常量也可以指向非常量,但有一个前提,constexpr指针只能指向固定地址中,如果一个地址是在函数中那就不能指向它,变量地址必须定义函数外或者一类超出函数本身外还能有效的变量,这类变量超出函数体外还能拥有固定地址。

例如:

int i = 0;
constexpr int j = 10;
//i 和j 都必须声明在函数体之外
constexpr const int *p = &i;//正确
constexpr int * p1 = &j;//正确

//-------------------
//如果将变量声明在函数体内就会报错
int main()
{
	int i = 0;
	constexpr int *p = &i;//编译器会报错
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学编程*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值