【问题标题】:lvalue and rvalue as function parameters左值和右值作为函数参数
【发布时间】:2018-12-11 19:27:51
【问题描述】:

我正在尝试理解 C++ 中的左值和右值。

所以我将它们用作传递给函数的参数。 在第一种情况下,我有两个函数,第一个有一个对 const int 的引用,在这种情况下,多亏了“const”(参见link),我可以将左值和右值都传递给第一个函数,我将拥有没问题。 在第二个函数中,我必须传递一个 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
}

【问题讨论】:

  • 右值引用转发引用 (f2(T&amp;&amp;))。
  • Jarod 的意思是,在模板参数推导的上下文中,T&amp;&amp; 可以绑定到很多不一定是右值引用的东西!
  • "我正在尝试理解左值和右值"我在这里没有看到任何右值。

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


【解决方案1】:

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

所以,当推导T&amp;&amp; 中的T 时,&amp;&amp; 不表示右值引用,而是推导出类型的引用,根据推导的结果可能是右值或左值引用.据说是转发引用。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多