constexpr 是 C++ 11 标准新添加的关键字,原先的标准中是只有const关键字的,作用是表示只读常量。但是,其实只读常量是两个属性,分为只读和常量,都用const来表示会产生歧义。
看下面的例子
#include <iostream>
#include <array>
using namespace std;
const int func1(){
return 10;
}
int main(){
array<int, func1()> arr1;
return 0;
}
对于arr1,虽然我们传入的也是一个常量,但是,const 返回类型仅仅表示a是一个只读属性的变量,而不是一个常量。只读变量和常量之间,是有区别的,明确这点非常重要。所以上面的例子中,func1编译会报错,报错信息为如下。
\test.cpp: In function ‘int main()’:
test.cpp:16:21: error: call to non-‘constexpr’ function ‘const int func1()’
16 | array<int, func1()> arr1;
| ~~~~~^~
这里补充const的一个重要概念就是,const后面的变量,仅仅表示不能通过该变量改变背后实际的值,但是如果其他变量也能够表示同一块内存空间,这个内存空间里的值是可以通过其他变量来改变的。
上面的程序做如下修改,arr2就可以正常的编译,因为传入的是一个constexpr代表的常量类型。
#include <iostream>
#include <array>
using namespace std;
const int func1(){
return 10;
}
constexpr int func2(){
return 20;
}
int main(){
// array<int, func1()> arr1;
array<int, func2()> arr2;
return 0;
}
constexpr的出现,就是将原先只读常量是只读还是常量的模糊边界区分开,分成了只读属性(使用const),和常量属性(使用constexpr)。
其实还有编译阶段的不同,后面有空再补充。。。
文章评论