左值
有名字、可取地址的变量。
右值
没名字、不能取地址的常量。
左值引用
绑定左值后,为该左值的别名。
右值引用
绑定右值后,为该右值的别名,此时该右值为左值属性。
右值引用的用途
移动语义
在C++中默认赋值操作为拷贝赋值,往往会利用左值引用来实现,那么如果不拷贝而采用移动来实现赋值操作呢?这时候右值引用应运而生,通常情况,采用右值引用的赋值操作为移动赋值。
万能引用
在模版函数下,T &&为万能引用,既可以接收左值也可以接收右值。原理:类型推导和引用折叠。
配合完美转发
万能引用往往会配合完美转发,forward<T>()。原因:右值引用的特性导致右值拥有了左值属性,再次传递该参数即会被识别为左值,需要完美转发来保留右值属性。
move()
将左值强转为右值,注意返回类型为remove_reference<T> &&,为右值引用,不过匿名右值引用即右值;注意move之后的对象不能被使用,此时它属于没有被定义;注意move不是直接移动内存的数据,它只是将左值转为右值,然后右值作为参数传递进赋值操作,再进行数据的移动。