当容器被移动时,根据 C 0x 标准草案,它被置于“有效但未指定的状态” 。在这种情况下,了解如何正确重用移动的容器至关重要。
考虑以下代码片段:
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);
根据标准,选项 ver3,其中涉及重新初始化移动容器,才是正确的做法。这是因为,在移动操作之后,对象被置于未指定的状态。
标准定义了“有效但未指定的状态”,如下所示:
“不是的对象状态”指定的,除了满足对象的不变量并且对象上的操作行为与其类型指定的一样“
这意味着移出的对象仍然存在并且可以操作上,但前提是满足先决条件。对于向量,使用clear()清除容器没有先决条件,并将其返回到已知状态。
因此,建议使用clear()来重置移动的容器并将其恢复到可用状态。
选项 ver2(涉及在移动的容器上调用clear())也是有效的。然而,假设移动的容器是空的,它可能会导致优化。使用clear() 可确保容器返回到已知状态,无论优化如何。
不建议使用选项 ver1,该选项不执行任何操作。这是因为容器在移动后处于未指定的状态,并且可能会表现出意外的行为。
以上是您应该如何重用移动的 C 容器?的详细内容。更多信息请关注PHP中文网其他相关文章!