简单来说声明为constexpr的函数,那么在编译阶段就能得到其返回值,故编译器可以直接将对应位置的函数调用直接转换为函数的返回值,故其实现了和内联函数一样的功能,例如:
- constexpr int test()
- {
- return 10;
- }
- constxepr int i = test() * 3 + 2;
编译器会直接将test()替换为10,在编译阶段就可以确定i=32。
需要注意constexpr的返回值必须是字面值类型变量(算术类型、指针、引用、字面值类等),函数形参可以是非常量,但实参必须是常量,例如:
- constexpr int test(int i)
- {
- return i;
- }
- constxepr int i = test(1) * 3 + 2;
是可以的,但
- constexpr int test(int i)
- {
- return i;
- }
- int j =1;
- constxepr int i = test(j) * 3 + 2;
是会报错的。
总的来说,constexpr函数用于常量表达式的函数,其遵守如下规定:
1. 返回值和形参都要是字面值;
2.不一定返回常量表达式。
最后说一下,为什么用constexpr,其优点是编译时计算出表达式的值,减少程序运行的开销。
end