以下测试在 g++ 4.8.1 中编译
int main()
{
    vector<string> v ;
    v.push_back("33333") ;
    v.push_back("44444") ;
    v.push_back("55555") ;
    {
        string x("xxxxx") ;
        v.push_back(x) ; //copy 
        cout << "x=" << x << endl ; //x=xxxxx
    } //checkpoint1
    {
        string y("yyyyy") ;
        v.push_back(std::move(y)) ; //move 
        cout << "y=" << y << endl ; //y=
    } //checkpoint2
    for(auto const i : v)
        cout << i << " " ; 
    cout << endl ; //33333 44444 55555 xxxxx yyyyy 
}
这是一个非常简单的来源,我的测试重点是std::move. 如您所见,string x是本地 var,而 executev.push_back(x)被x复制到 vector v,所以x仍然有"xxxxx"after push_back。在 checkpoint1 之后,x它就消失了(它只是本地的)但是向量v有它的值,因为x在做的时候被复制了v.push_back(x),所以没关系!
至于string y,它被移动到向量v,因为std::move被使用,所以你可以看到cout << "y=" << y显示"y=",而不是"y=yyyyy",这是正确的行为。
我没有得到的是,在 checkpoint2 之后,字符串y作为本地 var 已经结束,所以 vectorv作为y所有者(因为y被移动到 vector v,push_back(std::move(y))应该包含一个无效元素y,因为作为堆栈本地 var,生命在 checkpoint2 结束!
我很困惑,在checkpoint2之后,vectorv仍然有"yyyyy",y被移动到vector v,如果vectorv只有一个指针vptr = &y,因为y它是堆栈内存中的本地var,在它的范围之外,堆栈消失了,所以vectorvptr没用,看起来像这样不对!
所以它一定是vector有自己的记忆保存"yyyyy"在自己的,但如果是这样的话,它是一样的push_back(x),那为什么还要麻烦std::move(y)呢?
我错过了什么吗?