C++ 为什么是C++;模板类型匹配不匹配';t检索引用限定符'&';?

C++ 为什么是C++;模板类型匹配不匹配';t检索引用限定符'&';?,c++,templates,types,reference,match,C++,Templates,Types,Reference,Match,我有以下程序: #include<stdio.h> template<class T> void f(T t) { t += 1; } template<class T> void g(T &t) { t += 10; } int main() { int n=0; int&i=n; f(i); g(i); printf("%d\n",n); return 0; } #包括

我有以下程序:

#include<stdio.h>
template<class T> void f(T t) { 
    t += 1; 
}
template<class T> void g(T &t) {
    t += 10;
}
int main()
{
    int n=0;
    int&i=n;
    f(i);
    g(i);
    printf("%d\n",n);
    return 0;
}
#包括
模板空位f(T){
t+=1;
}
模板g(T&T){
t+=10;
}
int main()
{
int n=0;
int&i=n;
f(i);
g(i);
printf(“%d\n”,n);
返回0;
}
我希望如此,因为
I
是对
n
的引用,所以我希望模板函数
f
对于模板类型
T
应该得到
int&
。但事实并非如此。程序的输出是
10
,而不是我预期的
11

所以我的问题是,对于
f
,为什么
T
匹配变量
i
int
?这里的规则是什么


谢谢。

除非使用转发引用,否则模板演绎永远不会推断引用类型。因此,对
f
g
的调用都将
T
推断为
int

此外,表达式从来没有引用类型
i
n
作为表达式是相同的。它们有类型
int
和值类别lvalue

代码
int n=0;int&i=n
int i=0完全相同;int&n=i,除。它创建一个具有两个名称的对象,
i
n

即使您确实在代码中使用了转发引用,例如
templatevoid h(T&&T)
,调用
h(i)
h(n)
也会以同样的方式推断

这种对称性是为什么你会看到我刚才提到的大量线程引用的观点,我们认为“引用是一个自动取消引用的指针”是误导性的。