码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-04-22 15:59:33      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:编译   值类型   com   end   span   post   ons   结果   过程   

 

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函数的一个问题

 

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

标签:编译   值类型   com   end   span   post   ons   结果   过程   

原文地址:https://www.cnblogs.com/sunbines/p/8907386.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!