模板引用的类型推导

时间:2019-07-08 17:42:02

标签: c++ c++11 rvalue-reference type-deduction

让我们考虑以下代码:

template<typename T>
void f(T&);

int x=0;
int y=1;
f(x+y);

此代码似乎发生类型推导。但为什么?没有参考折叠规则将最终生成int &&。

1 个答案:

答案 0 :(得分:5)

根据C ++ 17标准[temp.deduct.call] / 3:

  

...如果P是引用类型,则将P引用的类型用于类型推导。 ...

此处,PT&,因此编译器将删除引用,并将T与参数x+y的类型进行比较。因此,它将T推导为int。然后,在重载解决阶段,由于无法将类型int的右值绑定到类型int&的参数,因此会发生错误。

模板参数推导必须在重载解析之前进行,因为否则编译器将不知道用于重载解析的参数类型。