为什么`fun(i)`被推导为`fun `,而不是`fun `,因为`i`是`int`的类型,而不是引用的确? ] >>]] > 我知道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类型。

问题描述 投票:0回答:1

我知道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);以及何时使用它,但我仍然无法包装我的...

c++ c++11 perfect-forwarding
1个回答
0
投票

您正在混淆值的类别和类型。如果参数的值类别为lvalue,则将T推导为int&,函数参数为lvalue-reference类型。如果参数的值类别为rvalue,则将T推导为int,函数参数为rvalue-reference类型。

请注意,i0均为int类型。

© www.soinside.com 2019 - 2024. All rights reserved.