在这里只能给出
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之后的类型为右值引用,如果把他赋值给一个右值引用,那么它的值不会被窃取,如果赋给一个左值,那么它的值就会被窃取。
再看下面这个例子:
这个例子事实上应该成功窃取,并且是一个浅拷贝,但是前后地址并不一样,原因就是这个字符串太短了,应该放在栈上,而move不会把栈上的东西浅拷贝,所以做了深拷贝。如果把这个长度加长,嘟嘟嘟嘟,成功啦!复制指针哇咔咔!
这个例子详见
B
B
B站:
这里