让我们考虑以下代码:
template<typename T>
void f(T&);
int x=0;
int y=1;
f(x+y);
此代码似乎发生类型推导。但为什么?没有参考折叠规则将最终生成int &&。
答案 0 :(得分:5)
根据C ++ 17标准[temp.deduct.call] / 3:
...如果
P
是引用类型,则将P
引用的类型用于类型推导。 ...
此处,P
是T&
,因此编译器将删除引用,并将T
与参数x+y
的类型进行比较。因此,它将T
推导为int
。然后,在重载解决阶段,由于无法将类型int
的右值绑定到类型int&
的参数,因此会发生错误。
模板参数推导必须在重载解析之前进行,因为否则编译器将不知道用于重载解析的参数类型。