c ++:函数左值或右值

时间:2012-12-13 06:49:35

标签: c++ c++11 lvalue rvalue

我刚刚开始通过阅读this page来学习c ++ 11中的右值参考,但我陷入了第一页。这是我从该页面获取的代码。

  int& foo();
  foo() = 42; // ok, foo() is an lvalue
  int* p1 = &foo(); // ok, foo() is an lvalue

  int foobar();
  j = foobar(); // ok, foobar() is an rvalue
  int* p2 = &foobar(); // error, cannot take the address of an rvalue
  1. 为什么foo()是左值?是因为foo()返回int&这基本上是一个左值?
  2. 为什么foobar()是左值?是因为foobar()返回int
  3. 一般来说,你为什么要关心函数是否是右值?我想如果我读完那篇文章的其余部分,我会得到答案。

1 个答案:

答案 0 :(得分:11)

L值是位置,R值是实际值。

所以:

  1. 由于foo()会返回引用(int&),因此本身就是左值。
  2. 正确。 foobar()是左值,因为foobar()会返回int
  3. 如果函数是否为R值,我们并不在乎。我们对此感到兴奋的是R值参考。
  4. 您指出的文章很有趣,我之前没有考虑转发或在工厂中使用。我对R值引用感到兴奋的原因是移动语义,例如:

    BigClass my_function (const int& val, const OtherClass & valb);
    
    BigClass x;
    x = my_function(5, other_class_instance);
    

    在该示例中,x被销毁,然后使用复制构造函数将my_function的返回复制到x中。为了在历史上解决这个问题,你会写:

    void my_function (BigClass *ret, const int& val, const OtherClass & valb);
    
    BigClass x;
    my_function(&x, 5, other_class_instance);
    

    这意味着现在my_function有副作用,而且阅读起来并不明显。现在,使用C ++ 11,我们可以编写:

    BigClass & my_function (const int& val, const OtherClass & valb);
    
    BigClass x;
    x = my_function(5, other_class_instance);
    

    让它像第二个例子一样高效运作。