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)
也会以同样的方式推断
这种对称性是为什么你会看到我刚才提到的大量线程引用的观点,我们认为“引用是一个自动取消引用的指针”是误导性的。