假设我们有一些代码
template <typename T>
void Foo(T&& param);
int x = 5;
// deduced Foo<int&>(int&).
// Argument type A = int. T = int&.
Foo(x);
int& rx = x;
// deduced Foo<int&>(int& &&) -> Foo<int&>(int&).
// But... argument type A = int&, an lvalue reference to int.
// Is T = int& or under the hood it is T = int& &?
Foo(rx);
根据https://en.cppreference.com/w/cpp/language/template_argument_deduction
4)如果P是一个对cv不合格的模板参数的右值引用(所谓的转发引用),并且对应的函数调用参数是一个左值,则使用对A的类型左值引用代替A进行推导
我想知道的是:“引用折叠”规则是否应用于推导类型 T(而不是 P,参数类型)?
那么我们真的有'Foo(rx)'T = int& &,它折叠成T = int&吗?