右值引用
右值引用
概念
左值
可以出现在 operator = 左边的
右值
只能出现在 operator = 右边的
右值不可取地址
常用的标准库函数
std::move()
该函数只有让左值绑定到右值引用的函数上的作用,除此之外,没有任何额外的功能
使用该函数并没有任何的作用,不产生任何优化
std::forward()
该函数目的是实现完美转交–即左值传递后仍然为左值,右值传递后仍然为右值
原因参照左值引用和右值引用均为左值, (也可以说是有名字的变量都为左值)
常见右值情况
a + b
临时对象
左值通过**
std::move()**函数绑定为右值
使用场景
需要对右值单独进行优化,一般是使用浅拷贝
需要在右值引用的重载函数中单独实现
实现时需要注意传递后需要改变原变量的指向,否则右值传递后会立即销毁
如果还指向原变量内容,则原变量的内容就会被销毁,导致后续操作产生未定义行为
对使用标准库容器的效率进行优化
尤其对 vector 的效率优化效果明显
主要是因为 vector 在使用的过程中,会发生**成长**的行为
成长过程中,如果有定义**移动构造**,会优先调用移动构造函数
但前提是确保移动构造函数不会抛出异常,具体做法是使用noexcpet关键字显示声明
标准库容器中,都带有移动拷贝构造和移动赋值函数
在确保赋值/拷贝构造后,原变量不会再继续使用,可以使用std::move()将原声明的变量绑定到移动拷贝构造/赋值函数上,进行浅拷贝**,来避免不必要的内存分配开销(仅改变指针指向),来实现赋值/拷贝的目的



