是不是带const的都是常量表达式?
是不是不带const的都不是常量表达式?
1、 常量表达式(const expression)是指值不会改变且在编译过程中就能够得到计算结果的表达式。
const int max_files=10; //max_files是常量表达式。
const int limits=max_files+20; //limits是常量表达式
int a=5; //a不是常量表达式
const int sz=get_size(); //sz不是常量表达式
因为变量sz的值知道程序运行时,才知道,所以sz不是常量表达式。
2、 constexpr变量
C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式,声明为constexptr的变量一定是一个常量,而且必须用常量表达式来进行初始化。
constexpr int mf=40; //mf是一个常量表达式
constexpr int limit=mf+5; //limit是一个常量表达式
constexpr int sz=size()+3; //只有在size()函数为constexpr类型时,这个表达式才会有效,并且sz才会为常量表达式
一般来说,如果你认定变量是一个常量表达式,那就把它声明为constexpr类型。
3、指针和constexpr
必须明确一点,在constexpr声明中如果定义一个指针,constexpr对指针有效,但对指针所指的对象无效,它的意思就是说,如果我们用constexpr声明一个指针,那么这个指针就是一个常量指针,这个指针的类型是常量,但是这个指针所指向的值(即等号右面的那个表达式)的类型我们就无从得知了。
const int *p=nullptr; //p是一个指向整型常量 的指针,即等号右侧的对象是常量型的,但是这个指针本身并不是常量型的
constexpr int *q=nullptr; //q是一个指向整数的常量指针,即q本身是常量型的一旦初始化就不能够修改。但是它所指的对象的类型不知道。
与其它常量指针一样,constexpr指针就是常量指针,这个指针既可以指向常量也可以指向非常量,只要指向的这个对象有一个确切的值。
const expr int *np=nullptr; //这句等价于 int *const np=nullptr; np是一个常量指针,它指向的值为空
int j=0;
constexpr int i=43; //i是一个常量型的整数且值为43
constexpr const int *p=&i; //p是一个常量指针,不仅p是常量型的,它指向的值也被声明为一个常量
constexpr int *p2=&j; //p是一个常量指针,指向一个整数,这个整数你不知它是否为常量型。
本文详细解释了常量表达式的概念及其在C++中的应用,包括如何使用const和constexpr声明常量,以及这些声明如何影响指针的特性。
181

被折叠的 条评论
为什么被折叠?



