如何定义左值和右值
给出一个关于左值和右值的严格定义还是比较困难的,不过为了你快速的理解,你可以这么认为:
C语言中,lvalue 是一个可以出现在赋值的左侧或右侧的表达式 ,而 rvalue 是一个只能出现在赋值的右侧的表达式。 比如说:
int a = 42;
int b = 43;
// a and b are both l-values:
a = b; // ok
b = a; // ok
a = a * b; // ok
// a * b is an rvalue:
int c = a * b; // ok, rvalue on right hand side of assignment
a * b = 42; // error, rvalue on left hand side of assignment
C++中,由于一些微妙的原因,上述的定义还不够准确,当然那个也是主要的判断方式。不过我们还可以认为,左值是一个表达式,引用一个内存位置,并允许我们通过 & 运算符获取该内存位置的地址。 而右值是一个不是左值的表达式。 例子如下:
// lvalues:
int i = 42;
i = 43; // ok, i is an lvalue
int* p = &i; // ok, i is an lvalue
int& foo();
foo() = 42; // ok, foo() is an lvalue
int* p1 = &foo(); // ok, foo() is an lvalue
// rvalues:
int foobar();
int j = 0;
j = foobar(); // ok, foobar() is an rvalue
int* p2 = &foobar(); // error, cannot take the address of an rvalue
j = 42; // ok, 42 is an rvalue