有一个临时或字面意思是否有必要拥有rvalue

Is it necessary to have a temporary or a literal to have an rvalue?

本文关键字:是否 rvalue 拥有 意思是 意思 有一个      更新时间:2023-10-16

这个问题询问所有临时性是否均为rvalue。

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

const int &ri = 2 + 3;

然后,可以使用相同的临时(2 + 3),这是一个rvalue作为后续表达式中的lvalue:

const int *pi = &ri;

所以这个临时性不是(仅)rvalue。

logic语句temporary ==> rvalue然后是错误的。

但是,我们不能写

const int &ri = &(2 + 3); // illegal, 2 + 3 -> temporary -> rvalue

int *i = &4; // illegal, 4 is an rvalue (literal)

int foo();
int *i = &foo(); // illegal, foo() -> temporary -> rvalue

因此,我的问题是,我们可以在没有某个表达式中生成一个rvalue有临时还是字面意思?rvalue ==> (temporary or literal)是真的吗?

产生临时对象的表达 r-values。有一个特殊的规则,该规则允许构成引用和R值引用绑定到R值,这将临时对象的寿命扩展到参考的寿命(请参阅12.2(5)),但这并不能使临时性。 - 对象表达式少于R值。

然而,一旦绑定到参考,参考变量本身就有一个名称,因此参考表达式为l值。

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

rvalue lvalue 属性适用于表达式,而不是 objects 。表达式可以是 lvalue rvalue 。过度简化产生值的表达式是 rvalue-excression ,而产生对象的表达式为 lvalue-expression lvalue to to rvalue 转换是读取的行为。

产生临时和文字的表达式都是 rvalue-expressions 它们代表a value 不是实际对象。

在您的示例中:

const int &ri = 2 + 3;
const int *pi = &ri;

表达式2+3是用于初始化常数参考的 rvalue-expression 。根据该语言,这意味着临时寿命的延长超出了当前表达式,直到引用不范围为止。之后,在第二个表达式中,子表达 ri是指的 lvalue-expression ,它是指临时对象的寿命已延长。

请注意,还有其他方法可以使用临时性创建 rvalue表达式,例如调用产生参考的成员:

struct test {
   test& thisTest() { return *this; }
};
test foo();
... foo().thisTest()

亚表达foo() rvalue-expression ,但表达式 foo().thisTest() lvalue-expression 。他们俩都指在完整表达结束时消失的临时对象。