C++:模板实参推断及引用折叠

本文详细介绍了C++中的模板实参推断机制,包括模板实参推断的概念、类型转换规则、模板显式实参、模板实参推断与引用的关系,特别是引用折叠的特殊情况。讲解了在模板实参推断过程中如何处理const、数组、函数指针的转换,并通过实例解析了模板参数匹配和引用折叠的规则。
摘要由CSDN通过智能技术生成

1.模板实参推断的概念

对于函数模板和类模板,编译器利用调用中的实参函数来确定其模板参数。 从函数实参来确定模板实参的过程,称为模板实参推断
模板实参的推断和常规的函数实参推断的规则不一样,尤其是在类型转换这一方面,两者大不相同。

2. 模板实参推断过程中的类型转换

同非模板函数,在一次调用中传递给函数模板的实参来初始化函数的形参。如果函数形参类型是泛型,采用特殊的初始化规则。

  • 1.const转换 : 可以将非const对象的引用或者指针传递给const的引用或指针形参。

  • 2.数组、函数指针转换:如果函数形参不是引用类型(前提!),则可以对数组或者函数类型的实参应用正常的指针转换。(详细解释看例子)

  • 3.其他类型的转换 : 算术转换(double -> int 等)、派生类向基类的转换、用户自定义的转换,都不可以用于模板实参推断

考虑以下两个例子:

template<typename T>
void funObj(T x, T y)
{
    cout << typeid(x).name() << endl;
    cout << typeid(y).name() << endl;
}
int a[10], b[42];
string s1("a value");
const string s2("another value");
funObj(s1, s2);
funObj(a, b);

这两次调用都是合法的。

  • funObj(s1,s2)的调用中,传递了一个string和const string**(s2的值不可改变,是顶层const,编译器会忽略掉),因为T不是引用类型,所以实参被拷贝**,因此原对象是否为const都不影响。
    不过考虑下面这组调用:
int i = 0, j = 0;
const int *cp = &i;
int * p = &i;
funObj(cp, p);

对函数funObj(cp,p)的调用是失败的。
等等,这和我们刚才说的好像有点矛盾,实参被拷贝,因此原对象是否为const不是不影响么?
注意,我们说的原对象是否为const不影响指的是原对象是否为顶层const&#x

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值