以下是14.8.2.1第3段的例子:
template <class T> int f(T&& heisenreference);
template <class T> int g(const T&&);
int i;
int n1 = f(i); // #1
int n2 = f(0);
int n3 = g(i);
对于#1,最终函数模板参数类型为T
,因为相同的段落建议
......如果P是a 引用类型,P引用的类型用于类型推导...
与此同时,最终参数将为lvalue reference to int
,因为同样的段落建议
...如果P是转发参考且参数是左值, 类型“左值引用A”用于代替A进行类型扣除。
总之,T
与lvalue reference to int
相同。但是,一旦lvalue reference to int
适合T
的位置,该类型就不再合理了,因为T&& heisenreference
将是rvalue reference to lvalue reference to int heisenreference
。事实上,我已经知道正确的答案是lvalue reference to int
,但我不知道如何严格按照标准得出这个结论。