关于 std::move 行为
About std::move behavior
我和 std::move
玩了一会儿,我发现了一些奇怪的东西:
string && foo(string && x) {
string && a = move(x);
return move(a); //both x and a = "asdfgh"
}
int main(){
string x,aa;
aa = "asdfgh";
x = foo(move(aa));
//aa = "", x = "asdfgh"
aa = "asdf";
x = move(aa);
//aa = "", x ="asdf"
}
main
中的行为很清楚,但为什么 foo
中调用 move
后,x
不是空的?为什么 x
没有 "steal"?
因为,在 foo
中,a
是一个右值 reference。 a
和局部变量 x
是同一个对象。
查看此代码:-
int main()
{
string aa;
aa = "asdf";
string &&x = move(aa);
x[0]='b';
cout<<boolalpha<<aa<<'\t'<<aa.empty()<<'\n';
string y = move(aa);
y[0]='c';
cout<<aa<<'\t'<<aa.empty()<<'\n';
return true;
}
输出:-
bsdf false
true
显然 x
是 rvalue reference
到 aa
而不是不同的对象(这就是为什么在更改 x
时 aa
也发生了变化).因此 aa
没有被清空。然而,另一方面 y
是与 aa
不同的对象,因此 std::move
语句清空了 aa
.
因此,您的代码在 foo
函数中显示了类似的行为。由于 foo
中的 x
& a
是 rvalue references
到 aa
,您的代码不会为空 aa
。
我和 std::move
玩了一会儿,我发现了一些奇怪的东西:
string && foo(string && x) {
string && a = move(x);
return move(a); //both x and a = "asdfgh"
}
int main(){
string x,aa;
aa = "asdfgh";
x = foo(move(aa));
//aa = "", x = "asdfgh"
aa = "asdf";
x = move(aa);
//aa = "", x ="asdf"
}
main
中的行为很清楚,但为什么 foo
中调用 move
后,x
不是空的?为什么 x
没有 "steal"?
因为,在 foo
中,a
是一个右值 reference。 a
和局部变量 x
是同一个对象。
查看此代码:-
int main()
{
string aa;
aa = "asdf";
string &&x = move(aa);
x[0]='b';
cout<<boolalpha<<aa<<'\t'<<aa.empty()<<'\n';
string y = move(aa);
y[0]='c';
cout<<aa<<'\t'<<aa.empty()<<'\n';
return true;
}
输出:-
bsdf false
true
显然 x
是 rvalue reference
到 aa
而不是不同的对象(这就是为什么在更改 x
时 aa
也发生了变化).因此 aa
没有被清空。然而,另一方面 y
是与 aa
不同的对象,因此 std::move
语句清空了 aa
.
因此,您的代码在 foo
函数中显示了类似的行为。由于 foo
中的 x
& a
是 rvalue references
到 aa
,您的代码不会为空 aa
。