是否需要临时或文字来获得右值?

Vin*_*Pii 1 c++ temporary rvalue

这个问题询问所有临时值是否都是右值.

答案是否定的,因为如果我们考虑这个表达式:

const int &ri = 2 + 3;
Run Code Online (Sandbox Code Playgroud)

那么,同样的临时(2 + 3)值(这里是一个右值)可以用作后续表达式中的左值:

const int *pi = &ri;
Run Code Online (Sandbox Code Playgroud)

所以这个临时不是(仅)一个右值.

然后逻辑语句temporary ==> rvalue是错误的.

但是,我们不能写

const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue
Run Code Online (Sandbox Code Playgroud)

要么

int *i = &4; // illegal, 4 is an rvalue (literal)
Run Code Online (Sandbox Code Playgroud)

要么

int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue
Run Code Online (Sandbox Code Playgroud)

因此我的问题是,我们可以在某个表达式中生成一个rvalue而不需要临时或文字吗?是rvalue ==> (temporary or literal)真的吗?

Ker*_* SB 5

产生临时对象的表达式 r值.有一个特殊的规则允许const引用和r值引用绑定到r值,这会将临时对象的生命周期延长到引用的生命周期(见12.2(5)),但这不会使临时 - 对象表达式任何较少的r值.

但是,一旦绑定到引用,引用变量本身就有一个名称,因此引用表达式是l-lvalue.

不要混淆表达式,变量和对象.

  • *不要混淆表达式,变量和对象*:正确.*l-value*和*r-value*适用于*表达式*.临时值不是*r值*,表达式产生临时*是***r值表达式* (5认同)