C++primer学习——左值和右值

时间:2022-12-12 12:30:22

定义:

左值:用的是对象的身份
右值:用的是对象的值(内存)

decltype:

当其作用于表达式时,如果求值结果是左值,那么返回一个引用
如果求值结果是右值,那么返回正常
int*p;
decltype(*p); //解引用运算生成左值,所以结果是int&
decltype(&p); //取地址生成右值
 

成员运算符:

箭头作用于指针类型的对象,结果是一个左值。
点运算符分成两种情况,成员所属对象是什么值,则返回什么值
pstr->size();//返回一个左值
(*pstr).size();//要看成员所属对象
//未实践

条件运算符:

cout<<((it == vec.end())?"no":"yes")<< endl;
 /*如果两个表达式都是左值或者能转换成同一种左值 返回左值*/
 
对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值
操作(a * b) = c显然不符合编程者的初衷,也没有任何意义
 
 

函数返回值:

函数的返回类型决定返回是否为左值:
当函数返回引用的时候所得到的是左值,其它所得到的都是右值。
int fo(int a,int b)
{
return a + b;
}
int&t = fo(,);//error:非常量引用初始值必须是左值