1、左值和右值
左值(left-values),缩写:lvalues ,located value 可定位值,其含义是可以明确其存放地址的值,更确切说对其的使用是基于地址
右值(right-values),缩写:rvalues , read value 可读的值,通常指代赋值运算=右侧的常量值,字面值,或者函数的返回值,它们没有具体的指代名,即无法通过地址访问,通常在赋值表达式结束后变销毁。
一般可以认为:左值对应变量的地址,右值对应变量的值,首先说左值和右值,他们绝不是简单的等号左边和右边的区别,总结来说:
- 左值可以寻址,而右值不可以。
- 左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。
- 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。
int value=fun();
最后c++11中还有一个将亡值的概念,是c++11中新增的跟右值引用相关的表达式,这样的表达式通常是将要被移动的对象
2、左值引用和右值引用
左值引用是对左值的引用类型,用 T & a 来表示
右值引用是对右值的引用类型,用 T &&a 来表示
左值引用和右值引用同为引用,他们在声明的同时必须被初始化(引用语法规定)
不要混淆 取地址 和 引用,当&说明符前面带有类型声明,则是引用,否则就是取地址(必须是声明以及初始化),通俗来说 &在 ”=” 号左边的是引用,右边的是取地址。
左值引用:也就是通常所述的引用,引用是原先左值的别名,在定义时完成初始化,并且不可以作变更。左值引用和左值共同使用内存中同一份内容数据。
const int&a = 1 //常量左值引用是可以绑定右值的
const int a = 1 //从语法上讲后者的右值在表达时结束后就销毁了,而前者不会
函数在传值方式传递参数,以及返回函数值(例如返回类型为复杂类类型(class)),都会执行拷贝构造,将带来大量无畏的拷贝构造开销。
这就