contexpr

1. constexpr变量

1对于修饰的变量而言,const并未区分出编译常量和运行常量;constexpr限定在编译器常量。

 

2. constexpr函数

 1 #include <iostream>
 2 #include <array>
 3 using namespace std;
 4 
 5 constexpr int foo(int i)
 6 {
 7   return i + 5;
 8 }
 9 
10 int main()
11 {
12   int i = 10;
13   std::array<int, foo(5)> arr; // OK
14 
15   foo(i); // Call is Ok
16 }

 

constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。不过,我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr。

而检测constexpr函数是否产生编译时期值的方法很简单,就是利用std::array需要编译期常值才能编译通过的小技巧。这样的话,即可检测你所写的函数是否真的产生编译期常值了。
 

参考资料

1. C++ const 和 constexpr 的区别?【知乎】

相关文章: