右值的构成

What constitutes of RValues?

本文关键字:      更新时间:2023-10-16

右值是内存中不可操作的区域,所以像整数这样的字面值被认为是右值。

  1. 常量构成右值吗?const int x = 0;至少可操作一次。
  2. 现在,编译器创建的临时对象也是rvalue,即使它们有可操作的内存区域。为什么会这样呢?
    因为他们不能被"用户"修改?是这个原因吗?

所以,一个不能被"用户"操纵的内存区域被称为RValue?

标量右值是求值为标量值的表达式,如42i + k(而标量左值是求值为标量对象的表达式,如i*int_ptrnumbers[0])。

类类型的

右值是求值为临时对象的表达式。最突出的例子是调用按值返回类对象的函数:

std::string foo()
{
    return "hello world";
}

根据上述函数定义,表达式foo()是右值。注意,我不是在谈论结果(这是一个临时对象),而是表达式 foo(),其求值产生该结果。

  1. 常量构成右值吗?Const int = 0;是可操作的吗至少一次。

在您的声明中,x既不是右值也不是左值,它被称为声明符id。当它用于(子)表达式时,它是一个不可修改的左值,可以初始化为任何常量表达式

2。现在,编译器创建的临时对象也是rvalue,即使它们具有可操作的内存区域。为什么会这样呢?因为他们不能被"用户"修改?是这个原因吗?

类类型的右值可以是可修改的,也可以是不可修改的,但内置类型的右值总是不限定的。

§3.10/9类右值可以有cv限定的类型;其他类型的右值始终使用cv-不限定类型。

考虑这个例子:

struct S {
     int x;
     void f(int s) { x = s; }
};
// ill-formed: Cannot assign to an rvalue of built-in type.
S().x = 42;
// Valid: A member function can be used to modify the referent of rvalue.
S().f(42);

子表达式S()创建一个类类型的右值,其生存期结束;求值。

lvalue指向一个内存位置,我们可以使用&运算符获取该内存位置的地址。rvalue是一个非lvalue的表达式。

1. Do constants constitute RValues? const int x = 0; is maniputable at least one time.

不,因为你可以这样做- const int *p = &x

  1. 所有变量,包括不可修改的(const)变量,都是左值。所以x是左值,而0是右值

  2. 临时对象被视为右值,因为它们在特定语句之外不存在。

你可以在这里阅读更多

右值是内存中不可操作的区域

右值是表达式,而不是"事物"。

右值可以指向对象("可操作的内存区域")。

所以像整数这样的字面量被认为是rvalue。

字面值是右值(不是"被认为"的右值),因为c++是这样定义的

常量构成右值吗?

const int x = 0;

实际上, xconst int类型的变量

根据上述x的定义,表达式x为左值。

现在,编译器创建的临时对象也是RValues

不,右值是表达式,不是对象

,即使它们有可操作的内存区域。为什么会这样呢?

事实并非如此。

因为它们不能被"用户"修改?是这个原因吗?

右值之所以是右值,是因为语言是这样定义的。

所以,一个不能被"用户"操纵的内存区域被称为RValue?

不,右值只指定表达式,而不是像内存那样存在于运行时的东西。

右值有时可以指向一个对象,该对象是一个用户可以操作的"内存区域"。

不能被"users"操作的内存区域

我不清楚你的意思;你是说只读存储器,还是别的什么?

首先——lval和rval是表达式的属性——表达式要么是rval,要么是lval。

为了回答你的另一个问题,由rval创建的临时可以通过使用rval引用来修改—该特性在c++11

中添加。

这个特性对于1)应用移动语义2)完美转发非常有用。

更多信息请访问http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

右值是内存中不可操作的区域

是错误的。右值绝对是可变的。在c++ 03中,这样做是令人头痛的,但可以合法地完成——在c++ 11中,这是非常常见的。

右值是产生即将死亡的对象的表达式。这是它们的定义性质。因此,您可以使用c++ 11的右值引用来窃取它们的资源,而不必担心,或者如果您绝望的话,可以使用c++ 03中的"交换优化"。这使得它们在许多情况下更正确,并且在许多情况下更快。

相关文章:
  • 没有找到相关文章