在外部破坏和构造 vector 的元素是否合法?当然,假设您将同一组元素保留在开始时的构造状态中?并假设不做任何明显愚蠢的事情,比如在同一个元素上调用析构函数两次,或类似的。
撇开异常(exception)不谈,我设想的情况如下:
int main ()
{
std::vector<std::string> v (10, "Hello");
v [2].std::string::~string ();
new (&v [2]) std::string ("World");
}
或者像这样的东西会是 UB 吗?其他标准容器呢?
最佳答案
这是完全有效的,就像您始终可以显式调用任何对象的析构函数一样。然而,这可能是愚蠢的。在销毁和复活元素之间, vector 处于无法被销毁的状态。如果由于某种原因它的析构函数被调用,你会得到 UB。这尤其危险,因为您可能不会一个接一个地执行这两个步骤。
现在,您不只是为了好玩才这样做。如果你想要例如要删除一个元素,您可以创建一个临时文件,将其与该元素交换,然后销毁临时文件。这样,您就不会拥有无法破坏 vector 的窗口。此外,这种方法甚至适用于像 std::string
元素这样的复杂情况,但也适用于更复杂的 vector 元素。
关于c++ - 你能在 C++ 中破坏和重建 vector 的元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49100469/