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.
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
foo()
an lvalue? is it because foo()
returns int&
which is basically an lvalue?foobar()
an rvalue? is it because foobar()
returns int
?L-Values are locations, R-Values are storable values (i.e., values that can be assigned: namespaces, for instance, are not assignable; thanks to @Maggyero for the edit suggestion).
So:
foo()
returns a reference(int&
), that makes it an lvalue itself.foobar()
is an rvalue because foobar()
returns int
.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With