左值和右值作为函数参数

时间:2018-12-11 19:27:51

标签: c++ rvalue-reference template-deduction const-reference reference-binding

我试图理解C ++中的Lvalue和Rvalue。

所以我将它们用作传递给函数的参数。 在第一种情况下,我有两个函数,第一个具有对const int的引用,在这种情况下,要感谢“ const”(请参见link),我可以将第一个函数Lvalue和Rvalue都传递给我,不会有任何问题。 在第二个函数中,我不得不传递Rvlaue,否则我将得到描述的错误。

void f1(const int& n){cout<<"[Lvalue]"<<endl;}
void f2(int&& n){cout<<"[Rvalue]"<<endl;}

int main()
{   
    const int n = 10;
    f1(n);
    f2(n);  //error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘const int’

}

好!

为什么第二个函数成为函数模板,如下例所示,我也可以传递一个Lvalue。

void f1(const int& n){cout<<"[Lvalue]"<<endl;}
template<class T>
void f2(T&& n){cout<<"[Rvalue]"<<endl;}

int main()
{   
    const int n = 10;
    f1(n);
    f2(n); //ok
}

1 个答案:

答案 0 :(得分:1)

重要的是,推论T为参考。因此,如果Tconst int&,那么T&&const int& &&是什么? 引用折叠规则说它是const int&

因此,推论T中的T&&时,&&并不表示右值引用,而是推导其类型的引用,并且可以是右值引用或左值引用,具体取决于扣除的结果。据说这是转发参考。