std::move以及右值引用等

在这里只能给出 s t d : : m o v e std::move std::move一个比较通俗的看法,不能从原理上深挖,真是惭愧。不过这里面涉及到一些小 t r i c k trick trick,还是挺有意思的。
先说 s t d : : m o v e std::move std::move的两个用法:

第一种:
vector<int> a = {1,2,3,4};
vector<int> b = std::move(a);
printf("%d",a[0]);

这个时候会报段错误

第二种:
vector<int> a = { 1,2,3,4 };
vector<int>&& b = std::move(a);
printf("%d", a[0]);

这个时候可以正常打印

根本原因就是 s t d : : m o v e std::move std::move之后的类型为右值引用,如果把他赋值给一个右值引用,那么它的值不会被窃取,如果赋给一个左值,那么它的值就会被窃取。

再看下面这个例子:

std::move以及右值引用等_第1张图片
这个例子事实上应该成功窃取,并且是一个浅拷贝,但是前后地址并不一样,原因就是这个字符串太短了,应该放在栈上,而move不会把栈上的东西浅拷贝,所以做了深拷贝。如果把这个长度加长,嘟嘟嘟嘟,成功啦!复制指针哇咔咔!
std::move以及右值引用等_第2张图片
这个例子详见 B B B站:
这里
std::move以及右值引用等_第3张图片

你可能感兴趣的:(c++)