为了账号安全,请及时绑定邮箱和手机立即绑定

重用已移动的容器?

重用已移动的容器?

C++
偶然的你 2019-10-19 16:24:26
重用已移动容器的正确方法是什么?std::vector<int> container;container.push_back(1);auto container2 = std::move(container);// ver1: Do nothing//container2.clear(); // ver2: "Reset"container = std::vector<int>() // ver3: Reinitializecontainer.push_back(2);assert(container.size() == 1 && container.front() == 2);根据我在C ++ 0x标准草案中阅读的内容;ver3似乎是正确的方法,因为移动后的对象位于“除非另有说明,否则将这些移出的对象置于有效但未指定的状态。”我从未找到任何“以其他方式指定”的实例。尽管我发现ver3有点round回,并且会更喜欢ver1,但vec3可以允许进行其他一些优化,但另一方面很容易导致错误。我的假设正确吗?
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

对象处于有效但未定义的状态基本上意味着,虽然不能保证对象的确切状态,但它是有效的,因此只要不依赖这些成员函数(或非成员函数),就可以保证它们正常工作在具有一定状态的物体上。


所述clear()成员函数对对象,因此可以从移动对象上调用(比它是有效的,当然其他)的状态没有先决条件。另一方面,例如front()取决于容器不为空,因此不能被调用,因为不能保证容器为非空。


因此,ver2和ver3都应该很好。


查看完整回答
反对 回复 2019-10-19
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

我认为您不能对移出的对象做任何事情(除了销毁它)。


您不能使用它swap来获得移动的所有优势,但将容器保持在已知状态吗?


查看完整回答
反对 回复 2019-10-19
  • 3 回答
  • 0 关注
  • 382 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信