RValues是不可操作的内存区域,因此像整数这样的文字被认为是RValues。
const int x = 0;
至少可以操作一次。因此,“用户”无法操作的内存区域称为RValue?
答案 0 :(得分:3)
标量rvalues是评估标量值的表达式,如42
或i + k
(标量左值是表达式,用于评估标量对象,如i
或*int_ptr
或{{ 1}})。
类类型的rvalues是评估为临时对象的表达式。最突出的例子是调用一个按值返回类对象的函数:
numbers[0]
鉴于上述函数定义,表达式std::string foo()
{
return "hello world";
}
是一个右值。请注意,我不是在谈论结果(这是一个临时对象),而是表达式 foo()
,其评估会产生该结果。
答案 1 :(得分:3)
- 常数是否构成RValues? const int x = 0;是可操纵的 至少一次。
醇>
在您的声明中,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)
所有变量,包括不可修改的(const)变量,都是左值。所以x是左值,而0是右值。
临时对象是rvalues,因为它们不存在于该特定语句之外。
您可以阅读更多here
答案 4 :(得分:0)
首先 - lval和rval是表达式的属性 - 表达式是rval或lval。
要回答您的其他问题,可以通过使用rval引用修改rvals创建的临时 - 此功能在c ++ 11中添加
此功能对于1)应用移动语义2)完美转发非常有用。
了解详情答案 5 :(得分:0)
RValues是不可操作的内存区域
rvalues是表达式,而不是“东西”。
rvalues 可以引用对象(“可操作的内存区域”)。
所以像整数这样的文字被认为是RValues。
文字是右值(不是“考虑”的右值),因为C ++的定义是。
常量是否构成RValues?
const int x = 0;
实际上, x
是const int
类型的变量。
鉴于x
的上述定义,表达式x
是左值。
现在,编译器创建的临时对象也是RValues
不,rvalues是表达式,不是对象。
即使他们有可操作的内存区域。为什么会这样?
事实并非如此。
因为“用户”无法修改它们?这是什么原因?
rvalues是rvalues,因为语言是以这种方式定义的。
因此,“用户”无法操作的内存区域称为RValue?
不,rvalue只指定表达式,而不是运行时存在的内存。
rvalue有时可以引用一个对象,这是一个用户可以操作的“内存区域”。
“用户”无法操作的内存区域
目前尚不清楚你的意思;你的意思是只读内存,还是别的东西?
答案 6 :(得分:0)
RValues是不可操作的内存区域
错误。 Rvalues绝对是可变的。在C ++ 03中这样做很麻烦,但可以合法地完成 - 在C ++ 11中它非常普遍。
Rvalues是产生即将死亡的东西的表达式。这是他们的定义属性。因此,您可以使用C ++ 11的右值引用来窃取他们的资源而不用担心它,或者如果您在C ++ 03中绝望,“交换优化”。这使得它们在许多情况下更加正确,并且在许多情况下更快。