RValues的构成是什么?

时间:2011-12-21 06:34:12

标签: c++ const lvalue rvalue temporary-objects

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

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

7 个答案:

答案 0 :(得分:3)

标量rvalues是评估标量值的表达式,如42i + k(标量左值是表达式,用于评估标量对象,如i*int_ptr或{{ 1}})。

类类型的rvalues是评估为临时对象的表达式。最突出的例子是调用一个按值返回类对象的函数:

numbers[0]

鉴于上述函数定义,表达式std::string foo() { return "hello world"; } 是一个右值。请注意,我不是在谈论结果(这是一个临时对象),而是表达式 foo(),其评估会产生该结果。

答案 1 :(得分:3)

  
      
  1. 常数是否构成RValues? const int x = 0;是可操纵的   至少一次。
  2.   

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

  

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

类类型的Rvalue可以是可修改的或不可修改的,但是内置类型的rvalue总是cv不合格。

  

§3.10/ 9类别rvalues可以具有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()创建一个类型的右值,其生命周期结束; 全表达。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

  2. 临时对象是rvalues,因为它们不存在于该特定语句之外。

  3. 您可以阅读更多here

答案 4 :(得分:0)

首先 - 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

了解详情

答案 5 :(得分:0)

  

RValues是不可操作的内存区域

rvalues是表达式,而不是“东西”。

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

  

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

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

  

常量是否构成RValues?

const int x = 0;

实际上, xconst int类型的变量

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

  

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

不,rvalues是表达式,不是对象

  

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

事实并非如此。

  

因为“用户”无法修改它们?这是什么原因?

rvalues是rvalues,因为语言是以这种方式定义的。

  

因此,“用户”无法操作的内存区域称为RValue?

不,rvalue只指定表达式,而不是运行时存在的内存。

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

  

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

目前尚不清楚你的意思;你的意思是只读内存,还是别的东西?

答案 6 :(得分:0)

  

RValues是不可操作的内存区域

错误。 Rvalues绝对是可变的。在C ++ 03中这样做很麻烦,但可以合法地完成 - 在C ++ 11中它非常普遍。

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