C++学习笔记58——模板实参推断

1,定义

模板实参推断:编译器用来确定实例化哪个函数模板的过程。编译器检查用模板形参指定的实参的类型,它用绑定到模板形参的类型或值自动实例化函数的一个版本。
简单的说,就是(根据调用函数模板的方式)确认函数模板类型形参的类型。
注意:只有函数模板才有模板实参推断,类模板的形参该实例化为什么类型是写死的,用不着“推断”。

2,类型转换原则

一般而言,不会转化实参以匹配已有的实例化,相反,会产生新的实例化,或产生不了实例化,报错。
只有两个例外:
  1. const转换:
  • 如果模板形参为const引用,则其可以接受const或非const引用
  • 如果模板形参为const指针,则其可以接受const或非const指针
  • 如果模板形参不是引用或指针(值传递),则形参和实参都忽略const
2. 数组或函数到指针的转换
  • 如果模板形参不是引用或指针(值传递),则数组会转化为指针,数组实参将当作指向其第一个元素的指针;
  • 如果模板形参不是引用或指针(值传递),则函数会转化为指针,函数实参将当作指向函数类型的指针;
举例如下:
	template <typename T> T fobj(T, T);//值传递
	template <typename T> T fref(const T&, const T&);//引用

	string s1("a value");
	const string s2("another value");

	fobj(s1,s2);//值传递,const被忽略
	fref(s1,s2);//引用,s1也被转成了const引用

	int a[10], b[42];
	fobj(a, b);//值传递,数组被转成指针,T被推断为int *,f(int*,int*)
	fref(a, b);//Error!!,引用,a导致T被推断为int(&T)[5]、b导致T被推断为int(&T)[5],矛盾




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值