C++ const和constexpr

const expression , 常量表达式 , 在《C++ Primer》的定义:值不会改变并且在编译过程就能得到计算结果的表达式。   它要求两点:值不会改变,编译过程得到结果。 因此不是所有的const常量都是常量表达式。

1 const int max_files=20;  // YES
2 const int limit = max_files + 1;   //YES
3 const int sz = get_size();  // NO ,函数必须运行后才能得到结果(不考虑constexpr函数) ;  是常量,但是不是常量表达式

 

因此,我们引出constexpr关键字,来验证是否为一个const expression。

1 constexpr int mf = 20;
2 constexpr int limit = mf + 1;
3 constexpr int sz = size () ;   // 当size()为constexpr函数时成立;

 

constexpr修饰变量,只能用字面值类型进行赋值(普通算术类型,指针,引用)。

尽管引用和指针都能定义成constexpr,但是初始值严格设置为nullptr,或者为某个固定地址(固定地址的含义:堆内存地址,常量区等,不是位于栈内存)。

constexpr如果修饰指针,那么表示常量指针,而不是指指针指向的内容。

1 const int *p=nullptr ;
2 constexpr int *q = nullptr ; // 指向常量的常量指针
3 
4 int j=0;
5 constexpr int i = 42;
6 constexpr const int *p=&i; // 常量指针+指针常量

 

总结:对于修饰Object来说

  • const并未区分出编译期常量和运行期常量。
  • constexpr限定在了编译期常量

 

摘录:

posted @ 2020-02-17 12:25  B_luePhantom  阅读(133)  评论(0编辑  收藏  举报