c++: function lvalue or rvalue

后端 未结 1 1922
渐次进展
渐次进展 2021-02-09 09:58

I just started learning about rvalue references in c++11 by reading this page, but I got stuck into the very first page. Here is the code I took from that page.



        
1条回答
  •  情话喂你
    2021-02-09 10:21

    L-Values are locations, R-Values are actual values.

    So:

    1. since foo() returns a reference(int&), that makes it an lvalue itself.
    2. Correct. foobar() is an rvalue because foobar() returns int.
    3. We don't care that much if a function is an R-Value or not. What we are getting excited about is R-Value references.

    The article you pointed to is interesting and I had not considered forwarding or the use in factories before. The reason I was excited about R-Value references was the move semantics, such as this:

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

    In that example, x is destroyed, then the return of my_function is copied into x with a copy constructor. To get around that historically, you would write:

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

    which means that now my_function has side effects, plus it isn't as plain to read. Now, with C++11, we can instead write:

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

    And have it operate as efficiently as the second example.

    0 讨论(0)
提交回复
热议问题