我刚刚开始通过阅读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
foo()
是左值?是因为foo()
返回int&
这基本上是一个左值?foobar()
是左值?是因为foobar()
返回int
?答案 0 :(得分:11)
L值是位置,R值是实际值。
所以:
foo()
会返回引用(int&
),因此本身就是左值。foobar()
是左值,因为foobar()
会返回int
。您指出的文章很有趣,我之前没有考虑转发或在工厂中使用。我对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);
让它像第二个例子一样高效运作。