1.constexpr 的作用
从代码到程序要经历两个过程:编译 和 链接
constexpr 关键字使得代码在编译过程中,如果编译器对于某个表达式已经得到足够多的信息,那么编译器会在编译器一结束就把该表达式的结果求出来。即对于无 constexpr 关键字的表达式是在运行期执行,对于有 constexpr 关键字的表达式是在编译期执行。
2.运用实例
#include "pch.h"
#include <iostream>
int fact(int n) {
return (n == 1 ? 1 : n * fact(n - 1));
}
constexpr int fact_const(int n) {
return (n == 1 ? 1 : n * fact_const(n - 1));
}
int main(int ac, char* av[]) {
int arr1[fact(4)]; // 错误,数组大小不确定
int array2[fact_const(4)]; //@1 正确。等价于写了 4 * 3 * 2
char group[fact_const(6)]; //@2 正确
if (ac > 1)
std::cout << fact_const(ac); // @3
return 0;
}
对于在 @1 @2 行,fact_const 的参数值在编译期就已确定,所以其结果作为一个常量值使用,而对于 @3 行,其参数值在编译期是不确定值,此时 fact_const 又转化为普通的函数调用。