右值的构成
What constitutes of RValues?
右值是内存中不可操作的区域,所以像整数这样的字面值被认为是右值。
- 常量构成右值吗?
const int x = 0;
至少可操作一次。 现在,编译器创建的临时对象也是rvalue,即使它们有可操作的内存区域。为什么会这样呢?
因为他们不能被"用户"修改?是这个原因吗?
所以,一个不能被"用户"操纵的内存区域被称为RValue?
标量右值是求值为标量值的表达式,如42
或i + k
(而标量左值是求值为标量对象的表达式,如i
或*int_ptr
或numbers[0]
)。
右值是求值为临时对象的表达式。最突出的例子是调用按值返回类对象的函数:
std::string foo()
{
return "hello world";
}
根据上述函数定义,表达式foo()
是右值。注意,我不是在谈论结果(这是一个临时对象),而是表达式 foo()
,其求值产生该结果。
- 常量构成右值吗?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
-
所有变量,包括不可修改的(const)变量,都是左值。所以x是左值,而0是右值
-
临时对象被视为右值,因为它们在特定语句之外不存在。
你可以在这里阅读更多
右值是内存中不可操作的区域
右值是表达式,而不是"事物"。
右值可以指向对象("可操作的内存区域")。
所以像整数这样的字面量被认为是rvalue。
字面值是右值(不是"被认为"的右值),因为c++是这样定义的。
常量构成右值吗?
const int x = 0;
实际上, x
是const 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中的"交换优化"。这使得它们在许多情况下更正确,并且在许多情况下更快。
- 没有找到相关文章