[英]C++ lvalues and rvalues
好吧,所以我一直在学习左撇子和左撇子 - 有没有精通C / C ++的人告诉我,我的想法是否正确?
考虑一下代码:
int i = 3;
int j = i;
这里我们有两个左值i
和j
,当i
被赋值给j
它变成一个隐式右值因为i
的副本存储在j
。 但是,如果代码看起来像:
int i = 3;
int j = &i;
j
和&i
都是左值,因为它们都是内存中的物理地址吗? 我理解它的方式是rvalues是临时数据,而lvalues有一个物理/可引用的内存地址。
对此的任何澄清都会很棒!
变量i
永远不会成为左值。 如果你可以将address-of运算符应用于某些东西(就像你在第二个例子中所做的那样),那么它就是一个左值。
此外,在第二实施例&i
是一个指向 i
,并具有类型int*
。 在j
的声明和要初始化它的值之间存在类型不匹配。
最后,虽然i
本身是一个左值,但是表达式&i
不是左值,因为你不能将address-of运算符应用于它(即你不能做&&i
)。
作为左值或左 值是表达式的属性。 通常,构成非const限定标识符的所有表达式都是可修改的左值 :
int i = 5;
i; // the expression "i" is an lvalue and is modifiable
const int j = 3;
j; // the expression "j" is still an lvalue, but not modifiable
可以通过任何赋值, ++
或--
运算符修改左值表达式(除非使用const
限定)。 您还可以在此类表达式上应用&
“address-of”运算符。
有些运算符比如一元*
,数组下标运算符[]
和.
和->
运算符也产生左值。 这意味着您可以说,例如, *p = 3
,或a[i] = 5
,或b.c++
或&c->d
。
另一方面,不是左值的表达式是右值(它们是临时的并且不能被修改)。 如果您编写类似3 = 5
或7++
,编译器会抱怨3
和7
子表达式不是左值。
这里我们有两个左手
i
和j
是的
当
i
被分配给j
它变成隐含的右值,因为i
的副本存储在j
不是真的, i
仍然是左值,但它被转换为右值来读取它的值。 这称为左值到右值的转换。 j
仍然是左值。
j
和&i
都是左值,因为它们都是内存中的物理地址吗?
j
是左值,但是&i
是右值; 特别是int*
类型的prvalue。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.