我有以下程序:
#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;
}
我希望如此,因为i
是对n
,所以我期望模板函数f
应得int&
对于模板类型T
。但事实上并非如此。程序的输出是10
, not 11
正如我所料。
所以我的问题是,对于f
, why T
火柴int
但不是int&
变量的i
?这背后的规则是什么?
Thanks.
除非您使用转发引用,否则模板推导永远不会推导引用类型。所以你的电话f
and g
两者都推论T
as int
.
此外,表达式永远不会有引用类型。i
and n
因为表达式是相同的。他们有类型int
和价值类别lvalue.
代码int n = 0; int &i = n;
完全一样int i = 0; int &n = i;
, 除了声明类型(1)。它创建一个具有两个名称的对象,i
and n
.
即使您确实在代码中使用了转发引用,例如template<class T>void h(T&&t)
,通话h(i)
and h(n)
会以同样的方式推断出来。
这种对称性就是为什么你会看到很多评论什么是参考?megathread 呈现的引用与我刚才一样,我们认为“引用是自动取消引用的指针”的描述具有误导性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)