constexpr限定符和常量表达式

定义

常量表达式(const expression)是指值不会改变并且在编译过程就能得到结果的表达式。

字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。

const int a = 4;	//字面值4是常量表达式,a 是一个const int对象,我们用常量表达式初始化它,因此a也是常量表达式
const string s = "str";	//同理s也是常量表达式

一个对象(或表达式)是不是常量表达式由它们的数据类型和初始值共同决定,例:

const int a = 20;	//初始值是常量表达式,因此const int对象a也是常量表达式
const int b = a + 1;	//a + 1是常量表达式,所以b是常量表达式
int c = 27;			//c 是一个int对象(变量),即使初始值是常量表达式
const int d = size();	//d不是常量表达式,因为其初始值size() 的返回值要到运行时才能得到。

constexpr变量

c++11标准允许声明constexpr类型的变量,声明为constexpr的变量一定是一个常量,而且必须使用常量表达式初始化。

constexpr int a = 20;	//20是常量表达式,a是一个常量
constexpr int b = a + 1;	//a + 1是常量表达式
constexpr int c = size();	//只有当size是一个constexpr函数(用constexpr修饰的函数在编译时就可以计算其结果了)时c才是常量

constexpr指针

也可用constexpr限定符声明指针,但仅对指针有效,与指针所指向的对象无关。

const int* p = nullptr;		//p是一个指向常量的指针,底层const:表示指针所指向的对象是一个常量
constexpr int* q = nullptr;	//q是一个指向整数的常量指针,顶层const:表示指针本身是个常量

constexpr指针既可以指向常量也可以指向一个非常量对象。

constexpr int* p = nullptr;	//np是一个指向常量的常量指针,其值为空
constexpr int i = 0;
int j = 4;
constexpr const int* q = &i;	//q是一个指向常量的常量指针,指向整型常量i
constexpr int* t = &j;			//t是常量指针,指向一个变量j

constexpr函数

constexpr 函数(constexpr function)是指能用于常量表达式的函数。

定义constexpr函数的方法与其他函数类似,不过要遵循几项约定:

①函数的返回类型及所有形参的类型都得是常量表达式。
②函数体中必须有且只有一条return语句。

constexpr int func() { return 42; } 	//func是一个无参的constexpr函数,程序在编译时验证该函数返回的是常量表达式
constexpr int a = func();			//a是一个常量表达式。编译器把对func的调用替换成其结果值。

因为要在编译过程中随时展开,constexpr函数被隐式地指定为内联函数。

常量表达式的适用场景

①指定数组的边界

int i = 99;
int a[i];		//错误,i不是一个常量表达式
constexpr int j = 99;
int b[j];		//正确,j是一个常量表达式

②指定非类型模板参数的值

template<unsigned size >
void test()
{
	//函数体
}

test<i> f;	//显示传入模板实参,并声明一个函数对象f。错误,因为i不是常量表达式
test<j> f2;	//正确,j是一个常量表达式

③在类定义中,为一个static const的整数类型的数据成员提供一个初始化器

const int x = 5;
class X
{
static const int x_ = x;	//正确,x是一个常量表达式
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值