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

【C++ Primer 第七章】5. contexpr用法

时间:2018-05-09 14:42:54      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:++   变量   过程   pre   cout   表达   上下文   names   stream   

contexpr和常量表达式

 

contexpr函数

• [test1.cpp]

 1 #include <iostream>
 2 using namespace std;
 3 
 4 constexpr int screen(int x)               // constexpr
 5 {
 6    return x; 
 7 }
 8 
 9 int main()
10 {   
11     const int x = 0;                     // const,是常量表达式,因为值不会发生改变
12     constexpr int z =  screen(x);        // constexpr
13     cout << z<<endl;
14     return 0;
15 }

• [test2.cpp]

 1 #include <iostream>
 2 using namespace std;
 3 
 4 constexpr int screen(int x)
 5 {
 6    return x; 
 7 }
 8 
 9 int main()
10 {   
11     int x = 0;                // 不是常量表达式,因为值会改变
12     int z =  screen(x);
13     cout << z<<endl;
14     return 0;
15 }


(1)[test1.cpp] 符合constexpr函数的常规用法,即函数的返回类型以及所有的形参类型必须是字面值类型(字面值类型即编译过程就能得到结果的类型)。此时,如果将 const int x = 0; 变为 int x = 0; 就会报错,因为screen函数的用在一个需要常量表达式的上下文中(constexpr类型的变量必须用常量表达式初始化),编译器在编译的过程中会检查函数的返回值是不是常量表达式,如果不是就会报错。 
(2)[test2.cpp] 表示constexpr函数可以返回非常量表达式,编译的过程没有报错,原因是screen函数并没有用在一个需要常量表达式的上下文中,编译器正在编译的过程中不会去检查该函数的返回值,也就不会报错。 
(3)作为补充,需要注意的是constexpr函数必须有return语句。

• 如果在不需要常量表达式的上下文,如: int z = screen(x);可以不返回常量表达式,此时编译器不会检查函数的结果是否会返回常量表达式。

• 如果是在需要常量表达式的上下文中,如: constexpr int z = screen(x);那么,constexpr函数必须可以返回常量表达式。此时编译器会去检查函数返回的结果是不是常量表达式,如果不是,就会报错。

contexpr构造函数

 

【C++ Primer 第七章】5. contexpr用法

标签:++   变量   过程   pre   cout   表达   上下文   names   stream   

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

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