c++左值和右值
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
都是左值,因为它们都是内存中的物理地址?我的理解是,右值是临时数据,而左值有一个物理的/可引用的内存地址。
对这一点的任何澄清将是伟大的!
变量i
始终是左值。如果你可以对某个东西应用地址操作符(就像你在第二个例子中所做的那样),那么它就是一个左值。
同样在第二个示例中,&i
是指向i
的指针,类型为int*
。在j
的声明和您想要初始化它的值之间存在类型不匹配。
最后,虽然i
本身是左值,但表达式&i
是而不是左值,因为您不能对其应用寻址运算符(即您不能对&&i
)。
这里我们有两个左值
i
和j
对
当
i
赋值给j
时,它成为隐式右值,因为i
的副本存储在j
不完全是,i
仍然是左值,但它被转换为右值来读取它的值。这被称为左值到右值的转换。j
仍然是左值
是否
j
和&i
都是左值,因为它们都是内存中的物理地址?
j
是左值,但&i
是右值;特别是int*
类型的右值
作为左值或右值是表达式的一个属性。一般来说,所有构成非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
子表达式不是左值。
- 没有找到相关文章