为了解决 const 关键字的双重语义问题,而将“常量”的语义划分给了新添加的 constexpr 关键字。

const 表示“只读”,constexpr 表示“常量”

常量在编译阶段就能计算出来,提高程序的执行效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <array>
using namespace std;

void dis_1(const int x){
// 错误,x是只读的变量
array <int,x> myarr{1,2,3,4,5};
cout << myarr[1] << endl;
}

void dis_2(){
const int x = 5; // 表示常量,应当使用 constexpr
array <int,x> myarr{1,2,3,4,5};
cout << myarr[1] << endl;
}

int main()
{
dis_1(5);
dis_2();
}

大部分场景下两者可以混用,但建议区分开。

1
2
const     int a = 5 + 4;
constexpr int a = 5 + 4;

在某些场景中,必须使用 constexpr:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <array>
using namespace std;

constexpr int sqr1(int arg){
return arg * arg;
}

const int sqr2(int arg){
return arg * arg;
}

int main()
{
array<int,sqr1(10)> mylist1; // 可以,因为sqr1是constexpr函数
array<int,sqr2(10)> mylist1; // 不可以,因为sqr2不是constexpr函数
return 0;
}

“只读”和“不允许被修改”之间并没有必然的联系,可借助指针、引用等其他变量修改(但无法通过变量自身去修改)。