当我阅读http://thbecker.net/articles/rvalue_references/section_01.html时,我得到了最简短的提示。
// lvalues:
//
int i = 42;
i = 43; // ok, i is an lvalue
int& foo();
foo() = 42; // ok, foo() is an lvalue
int* p1 = &foo(); // ok, foo() is an lvalue
// rvalues:
//
int foobar();
int j = 0;
j = foobar(); // ok, foobar() is an rvalue
int* p2 = &foobar(); // error, cannot take the address of an rvalue
j = 42; // ok, 42 is an rvalue
为什么int * p2 =&foobar();是错误语句,而int * p1 =&foo();不是错误。第一个是rvalue的后一个是左值?
提前致谢
最佳答案
因此,我们有两个功能:
int& foo();
int foobar();
foo
是一个将左值引用返回给int foobar
是一个返回int 函数调用表达式:
foobar()
foo()
两者都具有int类型(引用已从表达式中删除,因此
foo()
的类型为int
而不是lvalue-reference to int
)。这两个表达式具有不同的值类别:foobar()
是prvalue(返回非引用的函数的函数调用是prvalue)foo()
是一个左值(返回左值引用的函数的函数调用是左值)您不能使用右值的地址(prvalue是右值的一种),因此
&foobar()
是不允许的。您可以采用左值的地址,因此可以使用
&foo()
。关于c++ - 右值与左值之间的确切差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17357888/