重用移动的容器:正确的方法
在 C 中重用移动的容器的话题引发了讨论。本文探讨了处理此类情况的正确方法。
考虑以下代码片段:
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: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
根据 C 0x 标准草案,自迁移以来,ver3 似乎是首选方法对象处于“有效但未指定的状态”。为了澄清这个概念,我们参考一下标准中的定义:
[defns.valid] §17.3.26 valid but unspecified state an object state that is not specified except that the object’s invariants are met and operations on the object behave as specified for its type
这意味着被移动的对象仍然存在并且可以像往常一样进行操作,不包括有前提条件的操作(除非前提条件被验证)
例如,clear() 操作没有先决条件。通过使用clear(),容器将重置为定义的状态,以便后续使用。
因此,重用移动容器的正确方法是执行clear()操作,如ver2中所示代码片段。这种方法可确保容器恢复到已知且一致的状态。
以上是您应该如何在 C 中正确地重用移动的容器?的详细内容。更多信息请关注PHP中文网其他相关文章!