为什么向量中的元素需要是可复制的

Why elements in a vector need to be copy constructable?

本文关键字:可复制 元素 向量 为什么      更新时间:2023-10-16

我有这个问题是因为我正在阅读auto_ptr的部分。它说auto_ptr不能保存在矢量中,因为它具有破坏性的拷贝和赋值。我能以某种方式理解它,我能想到的一个例子是像auto_ptr ap = vec[0]这样的东西会让我大吃一惊。但如果我谨慎地使用它而不这样做,我能把auto_ptr存储在向量中吗?我不能储存还有什么更深层次的原因吗?也许向量的实现内部需要这样的假设,即元素需要是可复制可构造的?

谢谢。

当调整向量的大小时,它的元素会复制到一个新的支持数组中,这就是使用复制构造函数的地方。如果您有一个足够新的编译器,请考虑使用std::unique_ptr。

因为向量必须将已构建的对象存储在其存储器中。因此,它必须将对象复制到自己的存储器中。

同样是矢量,以确保scope-safety,它必须复制/移动传递的对象。

参见push_back 文档

std::vector::push_back
void push_back( const T& value );   (1)
void push_back( T&& value );    (2)     (since C++11)

将给定的元素值追加到容器的末尾。

1) 新元素被初始化为值的副本。

2) 值移动到新元素中。

参数

value-要附加的元素的值

类型要求

  • T必须满足CopyInsertable的要求才能使用过载

  • T必须满足MoveInsertable的要求才能使用过载

并且CopyInsertable id定义为

指定可以在未初始化的存储中就地复制构造该类型的实例。