RValues 是不可操作的内存区域,所以像整数这样的文字被认为是 RValues。
- 常量是否构成 RValues?
const int x = 0;
至少可以操作一次。 - 现在,编译器创建的临时对象也是 RValue,即使它们具有可操作的内存区域。为什么呢?
因为它们不能被“用户”修改?这是原因吗?
那么,“用户”无法操作的内存区域称为 RValue 吗?
RValues 是不可操作的内存区域,所以像整数这样的文字被认为是 RValues。
const int x = 0;
至少可以操作一次。那么,“用户”无法操作的内存区域称为 RValue 吗?
标量右值是计算为类似42
or的i + k
标量值的表达式(而标量左值是计算为类似i
or*int_ptr
或的标量对象的表达式numbers[0]
)。
类类型的右值是计算为临时对象的表达式。最突出的例子是调用按值返回类对象的函数:
std::string foo()
{
return "hello world";
}
给定上面的函数定义,表达式foo()
是一个右值。请注意,我不是在谈论结果(它是一个临时对象),而是其评估产生该结果的表达式。 foo()
- 常量是否构成 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()
创建一个类类型的右值,其生命周期是 ; 的结尾。充分表达。
Anlvalue
指的是内存位置,我们可以使用&
运算符获取该内存位置的地址。Anrvalue
是一个不是 的表达式lvalue
。
1. Do constants constitute RValues? const int x = 0; is maniputable at least one time.
不,因为你这样做——const int *p = &x
所有变量,包括不可修改 (const) 变量,都是左值。所以 x 是左值,而 0 是右值。
临时对象被设为右值,因为它们不存在于该特定语句之外。
你可以在这里阅读更多
RValues 是不可操作的内存区域
右值是表达式,而不是“事物”。
右值可以引用对象(“可操作的内存区域”)。
所以像整数这样的文字被认为是 RValues。
文字是右值(不是“考虑”的右值),因为 C++ 是这样定义的。
常量是否构成 RValues?
const int x = 0;
实际上,是一个类型x
的变量const int
。
鉴于上述定义x
,表达式x
是一个左值。
现在,编译器创建的临时对象也是 RValues
不,右值是表达式,而不是对象。
即使它们具有可操作的内存区域。为什么呢?
不是这样的。
因为它们不能被“用户”修改?这是原因吗?
右值是右值,因为语言是这样定义的。
那么,“用户”无法操作的内存区域称为 RValue 吗?
不,右值只指定表达式,而不是运行时存在的东西,比如内存。
右值有时可以引用一个对象,这是一个用户可以操作的“内存区域”。
“用户”无法操作的内存区域
不清楚你在这里的意思;你的意思是只读存储器,还是别的什么?
RValues 是不可操作的内存区域
错误的。右值绝对是可变的。在 C++03 中这样做是一件令人头疼的事情,但可以合法地完成——在 C++11 中这是非常普遍的。
右值是产生即将死亡的事物的表达式。这是他们的定义属性。因此,您可以使用 C++11 的右值引用来窃取他们的资源而无需担心,或者如果您很绝望,可以在 C++03 中“交换”。这使它们在许多情况下更正确,并且在许多情况下更快。
首先 - 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了解更多信息