一、左值和右值
-
C++中使用对象的值(内容)对象作右值,使用对象的身份(在内存中的位置)对象作左值。
①左值可代替右值使用,右值不可当左值使用。
②左值当右值使用时,实际使用的是它的内容(值)。 -
使用关键字decltype,如果表达式(不是变量)求值结果是左值,得到引用类型。
-
函数返回
①引用返回左值,调用返回引用的函数得到左值,其他返回类型得到右值。
②可像使用其他左值一样来使用返回左值函数的调用,可为返回类型是非常量引用的函数结果赋值。
运算符
-
算术运算符、逻辑和关系运算符
①运算对象和求值结果都是右值。 -
赋值运算符
①左侧运算对象是可修改的左值,返回左侧运算对象,求值结果是左值。 -
递增递减运算符
①作用于左值运算对象,前置版本将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。
②迭代器递增递减运算符同上。 -
成员访问运算符
①箭头运算符作用于指针类型的运算对象,结果是左值。
②点运算符如果成员所属对象是左值则结果是左值,成员所属对象是右值则结果是右值。 -
条件运算符
①cond ? expr1 : expr2,如果两个表达式都是左值或者能转换成同一种左值类型,运算结果是左值,否则运算结果是右值。 -
逗号运算符
①返回右侧表达式的值,若右侧运算对象为左值,运算符结果为左值。 -
其他
①内置解引用运算符、下标运算符求值结果为左值。
②迭代器解引用运算符、string和vector下标运算符求值结果为左值。
③取地址符作用于左值运算对象,返回指向运算对象的指针为右值。