constexpr函数
constexpr函数: constexpr函数是指用于常量表达式的函数,函数的返回值类型以及所有的形参类型必须是字面值,而且函数必须有且只有一条return语句。
1 [tect2.cpp] 2 #include <iostream> 3 using namespace stdl; 4 5 constexpr int screen(int x) // constexpr 6 { 7 return x; 8 } 9 10 int main() 11 { 12 const int x = 0; // const,是常量表达式,因为值不会发生改变 13 constexpr int z = screen(x); // constexpr 14 cout << z<<endl; 15 return 0; 16 }
1 [tect2.cpp] 2 3 #include <iostream> 4 using namespace std; 5 6 constexpr int screen(int x) 7 { 8 return x; 9 } 10 11 12 int main() 13 { 14 int x = 0; // 不是常量表达式,因为值会改变 15 int z = screen(x); 16 cout << z<<endl; 17 return 0; 18 }
分析 首先说明一下常量表达式的定义:常量表达式是指值不会改变且在编译阶段就可以得到结果的表达式。
(1)[test1.cpp] 符合constexpr函数的常规用法,即函数的返回类型以及所有的形参类型必须是字面值类型(字面值类型即编译过程就能得到结果的类型)。此时,如果将 const int x = 0; 变为 int x = 0;就会报错,因为screen函数的用在一个需要常量表达式的上下文中(constexpr类型的变量必须用常量表达式初始化),编译器在编译的过程中会检查函数的返回值是不是常量表达式,如果不是就会报错。
(2)[test2.cpp] 表示constexpr函数可以返回非常量表达式,编译的过程没有报错,原因是screen函数并没有用在一个需要常量表达式的上下文中,编译器正在编译的过程中不会去检查该函数的返回值,也就不会报错。
(3)作为补充,需要注意的是constexpr函数必须有return语句。
结论:可以这样认为:C++不要求constexpr函数必须返回常量表达式(以问题中的screen constexpr函数为例)
• 如果在不需要常量表达式的上下文,如: int z = screen(x); 可以不返回常量表达式,此时编译器不会检查函数的结果是否会返回常量表达式。
• 如果是在需要常量表达式的上下文中,如: constexpr int z = screen(x); 那么,constexpr函数必须可以返回常量表达式。此时编译器会去检查函数返回的结果是不是常量表达式,如果不是,就会报错。
参考资料
[1] SegmentFault,关于constexpr函数的一个问题
原文地址:https://www.cnblogs.com/sunbines/p/8907386.html