关于 std::move 行为

About std::move behavior

本文关键字:行为 move 关于 std      更新时间:2023-10-16

我玩了一会儿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的行为很清楚,但为什么在调用move之后foox不为空?为什么它没有从x"偷">

因为,在foo中,a是一个 r 值引用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

显然,xaa而不是不同对象的rvalue reference(这就是为什么在改变xaa发生了变化(。因此,aa没有被清空。然而另一方面,y是与aa不同的对象,因此std::move语句清空aa

因此,foo函数中的代码显示了类似的行为。由于foo中的xa rvalue references aa,您的代码不会清空aa