首页 > 解决方案 > 左值和右值作为函数参数

问题描述

我试图理解 C++ 中的左值和右值。

所以我将它们用作传递给函数的参数。在第一种情况下,我有两个函数,第一个引用了一个 const int,在这种情况下,感谢“const”(参见链接),我可以将 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’

}

好的!

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

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
}

标签: c++rvalue-referencetemplate-argument-deductionconst-referencereference-binding

解决方案


重要的是,它T被推断为参考。那么,如果Tconst int&,那么T&&ie是什么const int& &&参考折叠规则说它是const int&.

因此,当TinT&&被推导时,这&&并不表示右值引用,而是一个类型被推导的引用,并且可能是右值或左值引用,具体取决于推导的结果。据说是转发参考。


推荐阅读