contexpr函数

const用于运行期常量,constexpr用于编译期常量

• [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 = ; // const,是常量表达式,因为值不会发生改变
  12. constexpr int z = screen(x); // constexpr
  13. cout << z << endl;
  14. return ;
  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 = ; // 不是常量表达式,因为值会改变
  12. int z = screen(x);
  13. cout << z <<endl;
  14. return ;
  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函数必须可以返回常量表达式。此时编译器会去检查函数返回的结果是不是常量表达式,如果不是,就会报错。

函数指针

6.7节练习

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. int func1(int a, int b)
  6. {
  7. return a + b;
  8. }
  9.  
  10. int func2(int a, int b)
  11. {
  12. return a - b;
  13. }
  14.  
  15. int func3(int a, int b)
  16. {
  17. return a * b;
  18. }
  19.  
  20. int func4(int a, int b)
  21. {
  22. return a / b;
  23. }
  24.  
  25. void computer(int a, int b, int(*p) (int, int))
  26. {
  27. cout << p(a, b) << endl;
  28. }
  29.  
  30. int main()
  31. {
  32. int i = , j = ;
  33. decltype(func1) * p1 = func1, *p2 = func2, *p3 = func3, *p4 = func4;
  34. vector<decltype(func1) *> vf = { p1, p2, p3, p4 };
  35. for (auto c : vf)
  36. computer(i, j, c);
  37. system("pause");
  38. return ;
  39. }

【C++ Primer | 06】 函数的更多相关文章

  1. Node.js 教程 06 - 函数

    前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...

  2. 【C语言学习】-06 函数

    函数分类.函数声明和定义.函数调用,形参实参.函数嵌套调用

  3. C++Primer学习——函数

    编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...

  4. C++ Primer 笔记——函数

    1.函数内的局部静态对象在程序的执行路径第一次经过对象定义语句的时候初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响. size_t get_count() { ; ...

  5. python 06函数

    python中函数定义方法: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字test:函数名( ...

  6. C++ primer ch6 函数基础-1

    1.形参和实参:编译器并没有规定实参的求值顺序. 类似下面的代码,其行为是未定义的: ; printf("%d %d\n",++i,++i); 2.变量的初始化: 如果内置类型的变 ...

  7. PL/SQL 06 函数 function

    --函数 create or replace function  函数名称(参数1 类型1,参数2 类型2,...)  return 数据类型as  变量.常量声明;begin  代码;end; cr ...

  8. golang(06)函数介绍

    原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民 ...

  9. Day5 - 06 函数的参数-命名关键字参数

    引子:对于关键字参数,调用时可以传入任意个不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过[函数里定义的关键字参数]检查,例子里就是通过otherinfo检查.        >& ...

随机推荐

  1. 利用guava来实现本地的cache缓存

    guava是谷歌提供的工具类,功能强大,举个例子,我我想把数据存到本地,该咋办?我们想到的只有是全局的Map和session中.如果我们想实现这个容器的大小呢?时间呢?不好搞吧. guava就有这样的 ...

  2. Java编程思想 学习笔记6

    六.访问权限控制 访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关. 如何把变动的事物与保持不变的事物区分开来,这是面向对象设计中的一个基本问题. 为了解决这一问题,Java提供了访问权限修饰词 ...

  3. 如何用matplotlib绘制决策边界

    import matplotlib.pyplot as plt import numpy as np import sklearn import sklearn.datasets import skl ...

  4. Linux 命令详解(十一)Shell 解析 json命令jq详解

    前言 在自动化部署中涉及到shell脚本需要动态读取很多配置文件,最好是json格式. 更多jq信息: http://stedolan.github.io/jq/manual/ 一.根据key获取va ...

  5. Winform中使用WPF控件并动态读取Xaml

    1.添加新项 2.在构造函数中加入 public partial class UserControl1 : UserControl { public UserControl1() { Initiali ...

  6. 八、IIC 接口

    8.1 IIC接口介绍 8.1.1 IIC 总线的概念 I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. 主器件用于启动总线 ...

  7. jdk 环境

    一.下载 jdk 下载版本为:Linux x64 最新版本 curl -L -O http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u ...

  8. JavaScript之创建动态脚本

    //option= {type,src,text,isCreateScriptBySrc} function createDynamicScript(option){ var script = doc ...

  9. c#中富文本编辑器Simditor带图片上传的全部过程(项目不是mvc架构)

    描述:最近c#项目中使用富文本编辑器Simditor,记录一下以便以后查看. 注:此项目不是MVC架构的. 1.引用文件 项目中引用相应的css和js文件,注意顺序不能打乱,否则富文本编辑器不会正常显 ...

  10. SpringBoot在IDEA中实现热部署

    gradle构建形式 添加依赖 compile("org.springframework.boot:spring-boot-devtools") 其他设置 步骤1 步骤2 按下 C ...