关于右值 std::move

今天发现一个情况,对容器map 进行 std::move 之后,原map被清空了。

 

    map<int, int> tmp;

    tmp[1] = 1;
    tmp[2] = 2;
    tmp[3] = 3;
    tmp[4] = 4;
    tmp[5] = 5;

    map<int, int> tmp1;
    tmp1[1] = 3;
    tmp1[2] = 3;

    list<map<int, int>> lmap;

    lmap.push_back(std::move(tmp));

    lmap.push_back(tmp1);
 
    cout<<" " <<tmp.size()<<" "<<tmp1.size()<<endl; // 0 2
 
   tmp 被清空,内存直接拷贝到了lmap;
 
  
这篇文章里介绍的很详细,其中有一段:
 
注意,标准库对象支持moved from的左值在moved 之后它的对象原值是有效的(可以正常析构),但是是unspecified的,可以理解为空数据,但是这个对象的其他方法返回值不一定是0,比如size().所以,moved from 之后的对象最好还是不要使用吧?(如有不正确理解,请告知)
 
所以 不要使用。

 

posted on 2022-08-18 16:29  皖南  阅读(167)  评论(0)    收藏  举报