关于std :: move行为

时间:2015-12-13 13:21:57

标签: c++ c++11 syntax move-semantics

我和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

2 个答案:

答案 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

显然xrvalue referenceaa&amp;不是一个不同的对象(这就是改变xaa发生变化的原因)。因此aa没有被清空。但另一方面,yaa&amp;因此std::move语句清空了aa

因此,您的代码在foo函数中显示了类似的行为。作为x&amp; a中的foorvalue referencesaa,您的代码不会为空aa