关于 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 是一个右值 referencea 和局部变量 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

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

因此,您的代码在 foo 函数中显示了类似的行为。由于 foo 中的 x & arvalue referencesaa,您的代码不会为空 aa