当我阅读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/

    10-11 16:12