C++:自动向量重新分配调用复制构造函数?为什么?

use*_*176 9 c++ stdvector

我正在阅读C++ Primer,3rd Ed(Lippman和Lajoie),并且它说当需要重新分配向量以便为添加的更多元素腾出空间时push_back(),元素在新空间中被复制构造然后是析构函数被称为旧元素.我很困惑为什么这是必要的 - 为什么数据不能一点一点地复制?我假设答案与动态内存分配有关,但我目前的推理方法是,即使向量元素处理动态内存,实际存储在元素中的数据也将是指针,这意味着按位复制将保留它们指向的位置并且不会出现任何问题.我可以看到如何重新定位元素指向的动态分配的内存将是一个问题,因为它会使指针无效,但据我所知,向量重新定位没有理由这样做.

有人能给我一个不应该逐位移动的类的简单例子吗?

jjl*_*lin 8

这可能是最简单(但相当做作)的例子:

class foo
{
  int i;
  int* pi; // always points to i
};
Run Code Online (Sandbox Code Playgroud)

这里,复制构造函数将保持pi指向的不变量i.编译器本身无法自己找出这种关系,因此需要调用复制构造函数.