C++学习笔记(4)----模板实参推断
1. 如图所示代码,模板函数 compare(const T&, const T&) 要求两个参数类型要一样。
compare("bye","dad") 调用,将模板参数推断为 const char[4] (因为还有一个 NULL 字符串结尾),而且两个参数都为 const char[4],所以可以正常实例化模板函数。
而 compare("hi","world") 调用,将两个模板参数本别推断为 const char [3] 和 const char [6],两个参数类型不同,所以无法实例化该模板参数。

2. 如图所示:
calc(ch,'c')实例化了 char calc(char,int)函数,因为 'c' 的类型为 char ,可以转换为 int。
同样,因为 float 类型可以转换为 int 类型,所以 calc(d,f) 调用可以正常实例化 double calc(double,int) 函数。
又因为 ch 和 'c' 都是 char 类型,所以 fcn(ch,'c') 可以实例化 char fcn(char,char) 函数。
而 d 和 f 分别是 double 和 float 类型,所以无法实例化要求两个参数类型相同的 fcn(T,T) 函数。

3. 指定显示模板参数

4. 当一个函数参数是模板类型参数的一个普通(左值)引用时(即,形如 T&),绑定规则告诉我们,只能传递给它一个左值(如,一个变量或一个返回引用类型的表达式)。实参可以使const 类型,也可以不是。如果实参是const 的,则 T 将被推断为 const 类型:

5. 如果一个模板函数参数的类型是 const T &,正常的绑定规则告诉我们可以传递给它任何类型的实参-----一个对象(const 或非 const)、一个临时对象或是一个字面常量值。当函数参数本身是 const 时,T 的类型推断的结果不会是一个 const 类型。const 已经是函数参数类型的一部分;因此,它不会也是模板参数类型的一部分:

6. 接受右值引用参数的模板函数
void g(T&& val):

void g(T val):

void g(const T& val):

C++学习笔记(4)----模板实参推断的更多相关文章
- OpenCV 学习笔记(模板匹配)
OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- 【C++ Primer 第16章】2. 模板实参推断
模板实参推断:对于函数模板,编译器利用调用中的函数实参来确定模板参数,从函数实参来确定模板参数的过程被称为模板实参推断. 类型转换与模板类型参数 与往常一样,顶层const无论在形参中还是在是实参中, ...
- C++ Templates (1.2 模板实参推断 Template Argument Deduction)
返回完整目录 目录 1.2 模板实参推断 Template Argument Deduction 1.2 模板实参推断 Template Argument Deduction 当调用函数模板(如max ...
- Angular 5.x 学习笔记(1) - 模板语法
Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...
- 高放的c++学习笔记之模板与泛型编程
函数模板 作用 有很多时候参数的类型以及返回值的类型是可变的,我们通过定义模板来让函数能更灵活的运用. 我们设计一个比较函数,如果能比较的两个参数是int型的,两个参数也可能都是string型的,单独 ...
- tornado 学习笔记8 模板以及UI
Tornado 包含一个简单.快速而且灵活的模板语言. Tornado同样可以使用任何其他的python模板语言,虽然没有集成这些模板语言进RequestHandler.ren ...
- C++学习笔记30:模板与型式参数化
转型操作 接受目标型式作为模板参数 Programmer *p = dynamic_cast<Programmer*>(e) 模板工作原理 使用template<typename T ...
- play framework学习笔记之 模板引擎
模板语法 ${client.name} ${client?.name} 不能确定client是否存在的时候? #{extends /} #{doLayout /}#{get} #{set} 比如 #{ ...
随机推荐
- java运行时的内存区域
1.概述 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线 ...
- Dijkstra+优先队列 堆优化
关于堆优化 传统\(Dijkstra\),在选取中转站时,是遍历取当前最小距离节点,但是我们其实可以利用小根堆(STL的priority_queue)优化这个过程,从而大大降低复杂(\(O(V2+E) ...
- Centos7安装python3.7.1并与python2共存
转自:http://www.cnblogs.com/JahanGu/p/7452527.html参考:https://www.jb51.net/article/104326.htm 1. 备份原来的p ...
- Mac服务管理-Launchd(转)
背景: 在Mac下没有像Linux那样有很多的关于init方面的工具,从init的发展历史https://en.wikipedia.org/wiki/Init上可以知道,Mac使用的是Launchd作 ...
- (转)MySQL自带的性能压力测试工具mysqlslap详解
mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况 mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试 ...
- springboot: mybatis的使用
第一步:引入mybatis依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifa ...
- Elastic-Job源码分析之AbstractElasticJobExecutor分析
还记得我们在JobScheduler中,在创建任务详情时,会调用一个建造器JobBuilder来创建一个Job,类型是LiteJob. LiteJob.java /** * Lite调度作业. * * ...
- XRP共识算法
目录 共识协议属性 账本历史 信任的验证 共识协议属性 XRP Ledger使用的共识协议不同于之前的任何区块链.该协议称为XRP Ledger共识协议,旨在具有以下重要属性: 使用XRP Ledge ...
- 【很重要】优秀的常用的js库
http://lodashjs.com/docs/ 常用的各种工具库 sprintf 字符串格式 占位符替换等处理 devices.min.js
- python爬虫实战(八)--------知乎
相关代码已经修改调试成功----2017-4-22 一.说明 1.目标网址:知乎登入后的首页 2.实现:如图字段的爬取 zhihu_question表: zhihu_answer表: 3.数据:存放在 ...