模板引用的类型推导

Type deduction for template references

让我们考虑以下代码:

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

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

这段代码似乎发生了类型推导。但为什么?没有在最后产生 int&& 的引用折叠规则。

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

... If P is a reference type, the type referred to by P is used for type deduction. ...

这里,PT&,因此编译器删除引用并将 T 与参数类型 x+y 进行比较。因此它将 T 推断为 int。然后,在重载决议阶段,出现错误,因为类型 int 的右值不能绑定到类型 int&.

的参数

模板参数推导必须发生在重载决议之前,否则编译器将不知道用于重载决议的参数类型。