0

RValues 是不可操作的内存区域,所以像整数这样的文字被认为是 RValues。

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

那么,“用户”无法操作的内存区域称为 RValue 吗?

4

7 回答 7

4

标量右值是计算为类似42or的i + k标量值的表达式(而标量左值是计算为类似ior*int_ptr或的标量对象的表达式numbers[0])。

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

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

给定上面的函数定义,表达式foo()是一个右值。请注意,我不是在谈论结果(它是一个临时对象),而是其评估产生该结果的表达式。 foo()

于 2011-12-21T06:55:43.830 回答
3
  1. 常量是否构成 RValues?常量 int x = 0; 至少可以操作一次。

在您的声明中,x它既不是右值也不是左值,它被称为declarator-id。(参见 C++03 中 8/4 的语法)当它用于(子)表达式时,它是一个不可修改的左值,可以初始化为任何常量表达式

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

类类型的右值可以是可修改的或不可修改的,但内置类型的右值始终是 cv-unqualified。

§ 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()创建一个类类型的右值,其生命周期是 ; 的结尾。充分表达。

于 2011-12-21T08:40:52.873 回答
1

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

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

不,因为你这样做——const int *p = &x

于 2011-12-21T06:56:06.567 回答
1
  1. 所有变量,包括不可修改 (const) 变量,都是左值。所以 x 是左值,而 0 是右值。

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

你可以在这里阅读更多

于 2011-12-21T06:58:40.920 回答
1

RValues 是不可操作的内存区域

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

可以引用对象(“可操作的内存区域”)。

所以像整数这样的文字被认为是 RValues。

文字是右值(不是“考虑”的右值),因为 C++ 是这样定义的

常量是否构成 RValues?

const int x = 0;

实际上,是一个类型x的变量const int

鉴于上述定义x,表达式x是一个左值。

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

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

即使它们具有可操作的内存区域。为什么呢?

不是这样的。

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

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

那么,“用户”无法操作的内存区域称为 RValue 吗?

不,右值只指定表达式,而不是运行时存在的东西,比如内存。

右值有时可以引用一个对象,这是一个用户可以操作的“内存区域”。

“用户”无法操作的内存区域

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

于 2011-12-21T09:48:28.083 回答
1

RValues 是不可操作的内存区域

错误的。右值绝对是可变的。在 C++03 中这样做是一件令人头疼的事情,但可以合法地完成——在 C++11 中这是非常普遍的。

右值是产生即将死亡的事物的表达式。这是他们的定义属性。因此,您可以使用 C++11 的右值引用来窃取他们的资源而无需担心,或者如果您很绝望,可以在 C++03 中“交换”。这使它们在许多情况下更正确,并且在许多情况下更快。

于 2011-12-21T18:35:28.180 回答
1

首先 - lval 和 rval 是表达式的属性 - 表达式是 rval 或 lval。

要回答您的其他问题,可以通过 rval 引用来修改由 rvals 创建的临时对象-此功能是在 c++11 中添加的

此功能对于 1) 应用移动语义 2) 完美转发非常有用。

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

于 2011-12-21T08:35:58.957 回答