我和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
?
答案 0 :(得分:4)
因为,在a
中,a
是r值引用。 x
和局部变量function secondsToTimeString(seconds) {
var minutes = 0, hours = 0;
if (seconds / 60 > 0) {
minutes = parseInt(seconds / 60, 10);
seconds = seconds % 60;
}
if (minutes / 60 > 0) {
hours = parseInt(minutes / 60, 10);
minutes = minutes % 60;
}
return ('0' + hours).slice(-2) + ':' + ('0' + minutes).slice(-2) + ':' + ('0' + seconds).slice(-2);
}
是同一个对象。
答案 1 :(得分:3)
请参阅此代码: -
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
&amp;不是一个不同的对象(这就是改变x
时aa
发生变化的原因)。因此aa
没有被清空。但另一方面,y
与aa
&amp;因此std::move
语句清空了aa
。
因此,您的代码在foo
函数中显示了类似的行为。作为x
&amp; a
中的foo
为rvalue references
到aa
,您的代码不会为空aa
。