模板引用的类型推导
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. ...
这里,P
是 T&
,因此编译器删除引用并将 T
与参数类型 x+y
进行比较。因此它将 T
推断为 int
。然后,在重载决议阶段,出现错误,因为类型 int
的右值不能绑定到类型 int&
.
的参数
模板参数推导必须发生在重载决议之前,否则编译器将不知道用于重载决议的参数类型。
让我们考虑以下代码:
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 byP
is used for type deduction. ...
这里,P
是 T&
,因此编译器删除引用并将 T
与参数类型 x+y
进行比较。因此它将 T
推断为 int
。然后,在重载决议阶段,出现错误,因为类型 int
的右值不能绑定到类型 int&
.
模板参数推导必须发生在重载决议之前,否则编译器将不知道用于重载决议的参数类型。