缘起
C++是oop语言,所以以对象为组织架构,可能某些对象中并没有实现它的赋值语句,且它并不需要赋值,那么在函数中,需要将之作为入参,我们必须得到它的地址,也就是指针,但是指针操作有风险,那么我们可以使用右值引用。
换言之,我们将该变量直接送到调用函数中,不需要创建临时变量,这也将减少内存开销以及赋值所带来的时间开销
右值、左值
避免无谓的复制,提高了程序性能
避免深拷贝,优化性能
&& 可能是右值引用也可可能是左值引用
& 也可能是左值
左值,是能够被赋值的
右值,是临时的
左值引用,右值引用
- 左值引用是左值的别名
- 右值引用需要借用移动语义来使用右值
move
move的结果一定是右值
a = MyString("Hello"); // move
MyString b = a; // copy
MyString c = std::move(a); // move, 将左值转为右值
forward
向前引用 ,即当前作用域里面的初始状态作为,比如如下代码, 便是将t转为入参时候的类型。
注释1 调用第一个aaa
注释2 调用第二个aaa
第一个aaa中 T a实质是 c的左值
第二个aaa中 T a实质是 c的右值
template <class T>
void aaa(T & t)
{
T a = std::forward(T);
}
void aaa(T && t)
{
T a = std::forward(T);
}
int c = 3;
aaa(c); //1
aaa(std::move(c)); //2
判定左值还是右值的方法
合理使用多态性进行左值右值的判定
template <class T>
bool is_rightValue(T& t)
{
return false; //这是左值
}
template <class T>
bool is_rightValue(T&& t)
{
return true; //这是右值
}