内容参考于《21天学通C++》(第八版)
三.constexpr关键字
1. 示例
#include <iostream>
constexpr double GetPi() { return 22.0 / 7; }
constexpr double TwicePi() { return 2 * GetPi(); }
int main()
{
using namespace std;
const double pi = 22.0 / 7;
cout << "constant pi contains value " << pi << endl;
cout << "constexpr GetPi() returns value " << GetPi() << endl;
cout << "constexpr TwicePi() returns value " << TwicePi() << endl;
return 0;
}
运行结果
constant pi contains value 3.14286
constexpr GetPi() returns value 3.14286
constexpr TwicePi() returns value 6.28571
这个程序演示了两种计算 pi 值的方法:一是在第 8 行声明常量 pi;二是在第 2 行声明常量表达式 GetPi()。 GetPi()和TwicePi()看起来像函数,但其实不是函数。函数在程序执行期间被调用,但GetPi()和 TwicePi()是函数表达式,编译器将每个 GetPi()都替换成了 3.14286,并将每个TwicePi()都替换成了 6.28571。通过在编译阶段对 TwicePi()进行解析,程序的执行速度比将这些计算放在函数中时更快。
2. 作用
通过关键字 constexpr,可让常量声明像函数,通过英文可以看出来:const常量+expr表达式。常量表达式看起来像函数,但在编译器和应用程序看来,它们提供了优化可能性。只要编译器能够从常量表达式计算出常量,就可在语句和表达式中可使用常量的地方使用它。他的实质还是const或者是常规函数。
3. 常规函数
使用 constexpr 并不能保证一定会进行编译阶段优化。例如,如果您使用常量表达式来计算用户输入的数字的两倍,由于编译器无法计算这种表达式的结果,因此它们可能忽略关键字 constexpr,进而将常量表达式视为常规函数进行编译。