我们知道,constexpr 是 C++ 11 标准新添加的关键字,在此之前(C++ 98/03标准)只有 const 关键字,其在实际使用中经常会表现出两种不同的语义。举个例子:有关 constexpr 的功能和用法,您可以阅读《C++11 constexpr》一节。
#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; array <int,x> myarr{1,2,3,4,5}; cout << myarr[1] << endl; } int main() { dis_1(5); dis_2(); }可以看到,dis_1() 和 dis_2() 函数中都包含一个 const int x,但 dis_1() 函数中的 x 无法完成初始化 array 容器的任务,而 dis_2() 函数中的 x 却可以。
有读者可能会问,“只读”不就意味着其不能被修改吗?答案是否定的,“只读”和“不允许被修改”之间并没有必然的联系,举个例子:在上面的实例程序中,dis_2() 函数中使用 const int x 是不规范的,应使用 constexpr 关键字。
#include <iostream> using namespace std; int main() { int a = 10; const int & con_b = a; cout << con_b << endl; a = 20; cout << con_b << endl; }程序执行结果为:
10
20
const int a = 5 + 4; constexpr int a = 5 + 4;它们是完全等价的,都可以在程序的编译阶段计算出结果。但在某些场景中,必须明确使用 constexpr,例如:
#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; }其中,因为 sqr2() 函数的返回值仅有 const 修饰,而没有用更明确的 constexpr 修饰,导致其无法用于初始化 array 容器(只有常量才能初始化 array 容器)。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有