我有以下程序:
#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 ,而不是我期望的 11 .
I expect that because i is a reference to n, so I expect that the template function f should get int& for template type T. But in fact it doesn't. The output of the program is 10, not 11 as I expected.
所以我的问题是,对于 f ,为什么 T 匹配变量我?这里的规则是什么?
So my question is, for f, why T matches int but not int& of variable i? What's the rule behind here?
谢谢.
推荐答案除非您使用转发引用,否则模板推导永远不会推导引用类型.因此,您对 f 和 g 的调用都会推断出 T 为 int .
Template deduction never deduces a reference type unless you use a forwarding reference. So your calls to f and g both deduce T as int.
此外,表达式永远不会具有引用类型. i 和 n 是相同的表达式.它们具有类型 int 和值类别 lvalue .
Also, an expression never has reference type. i and n as expressions are identical. They have type int and value category lvalue.
代码 int n = 0;int &i = n; 和 int i = 0; 完全一样int& n = i; ,但 decltype(1).它创建一个具有两个名称的对象,分别是 i 和 n .
The code int n = 0; int &i = n; is exactly the same as int i = 0; int &n = i;, except for decltype(1). It creates one object with two names, i and n.
即使您确实在代码中使用了转发引用,例如 template< class T> void h(T& t),调用 h(i)和 h(n)会得出同样的方式.
Even if you did use a forwarding reference in your code, e.g. template<class T>void h(T&&t), the calls h(i) and h(n) would deduce the same way.
这种对称性就是为什么您在 megathread就像我现在所说的那样存在引用,并且我们认为引用是自动取消引用的指针"的描述具有误导性.
This symmetry is why you see many comments on the What is a reference? megathread present references as I have just now, and we consider the description "a reference is a pointer that automatically dereferences" to be misleading.
更多推荐
为什么C ++模板类型匹配不检索引用限定符'&'?
发布评论