我试图理解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
}
答案 0 :(得分:1)
重要的是,推论T
为参考。因此,如果T
是const int&
,那么T&&
即const int& &&
是什么? 引用折叠规则说它是const int&
。
因此,推论T
中的T&&
时,&&
并不表示右值引用,而是推导其类型的引用,并且可以是右值引用或左值引用,具体取决于扣除的结果。据说这是转发参考。