首先注意lvalue 和rvalue 中的l r 不是 left和right
而是
l = locator value 可以寻址的数据,明确一定是一个地址容纳一个数据,可以在该条语句后面再找到这个值
r= read value 不可寻址数据或者用来读取的数据
右值引用 会得到一个左值
x++ 右值; (产生一个临时变量返回,然后x+1)
++x左值;(先x+1再返回x)
左值引用依然得到左值,就是起一个别名 符号是&
int a=10;
int &b=a;
此时 b和a地址在内存中是相同的。
右值引用得到一个左值,符号是 &&
可以理解为用一个变量去保存这个临时变量。对于类类型不用多次调用拷贝构造函数(主要用途)。
int && c=10 是可行的
所以得到的c是一个左值
这样写意义不大。但是对于一个类。
比如 class A 有一个+方法
A a,b
A c=a+b 和A &&c=a+b就有区别了。
第一种
A c=a+b 先调用 a+b产生了一个临时对象 temp. 然后再调用了拷贝构造函数 c=temp
第二种 A &&c=a+b就没有产生这个temp 而是直接用c去接受了这个 +的值 没有产生多的拷贝构造函数。
std::move干的就是这个事情。将一个左值转换成一个右值引用,减少拷贝,但是原。
#include
#include
#include
using namespace std;
int main()
{
string str = "hello";
cout << "before str: " << str << endl;
vector vstr;
vstr.emplace_back(std::move(str));
cout << "after str: " << str << endl;
return 0;
}
比如这个move 将原来str的所有权转移直接变成了vstr的参数放进去。同时原str变成了空字符串。
这个类需要实现移动构造函数 移动赋值函数 A(A&& r) A operator= (A&& r);
一些使用的坑