【C++ Primer 第六章】 constexpr函数

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函数必须可以返回常量表达式。此时编译器会去检查函数返回的结果是不是常量表达式,如果不是,就会报错。

猜你喜欢

转载自www.cnblogs.com/sunbines/p/8907386.html