本文主要是介绍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是一个常量表达式
};
这篇关于constexpr限定符和常量表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!