我知道i
是一个左值,5
确实是一个右值(即5
未命名)。我知道如何使用template <typename T> void fun(T&& x);
以及何时使用它,但是由于fun(i)
是fun<int&>
的类型,所以我仍然无法理解为什么fun<int>
推导出为i
而不是int
的原因。确实不是参考?
我知道关于rvalue \ lvalue和关于SO的正向引用有很多问题,但是我的问题却大不相同。我浏览了许多相关的答案,实际上没有人详细解释过。
以下是相关代码段:
template <typename T> void fun(T&& x); int i; fun(i); // deduce<int&>(int& &&) -> deduce<int&>(int&) fun(5); // deduce<int>(int&&)
我知道我是一个左值,而5确实是一个右值(即5是未命名的)。我知道如何使用模板
void fun(T && x);以及何时使用它,但我仍然无法包装我的...
您正在混淆值的类别和类型。如果参数的值类别为lvalue,则将T
推导为int&
,函数参数为lvalue-reference类型。如果参数的值类别为rvalue,则将T
推导为int
,函数参数为rvalue-reference类型。
请注意,i
和0
均为int
类型。