首先,让我们看一下我的问题的代码:
#include <iostream>
template<typename T>
void sum(T x)
{
x += 1;
}
int main()
{
int a = 4;
int& x = a;
sum(x);
std::cout << x;
}
我所期望的:因为我传递了对 int 的引用,所以我希望它在类型推断上T是相等的,int&并且生成的函数看起来像这样:
//T = int&
void sum(int& x)
{
x += 1;
}
然而,程序的输出是:而不是4,正如预期的那样,5。这就是为什么我有这个问题。以下内容写在cppreference本身上:
1) 如果 P 不是引用类型,
a) 如果 A 是数组类型,则将 A 替换为数组到指针转换得到的指针类型;
b) 否则,如果 A 是函数类型,则将 A 替换为函数到指针转换得到的指针类型;
c) 否则,如果 A 是 cv 限定类型,则忽略顶级 cv 限定符进行推导
我的意思是,就我而言,我接受 "not a reference type" (not a reference type) T。只是说只有const-volatile修饰符会被忽略,还是我错了?为什么我的模板是这样生成的?或者模板不能是引用类型?出现了同样的问题,它可以是 typeint*吗?
生成函数模板时,可以从函数参数中推断出类型。您正在传递某种类型的对象,而引用只是对象的另一个名称(引用不是类型),因此您得到了一个函数
也就是说,您正在修改一个完全不同的对象。如果它如您所料,它将限制功能的可能性。如果我不想修改传递的对象怎么办?我们必须检查链接是否通过。
您也可以传递一个指针,然后推断的类型将是 int*。
PS我认为很多教程都没有解释这一点......