我有这个类:
class Object {
public:
Object();
Object(const Object&) = delete;
Object& operator=(const Object&) = delete;
~Object();
};
默认复制构造函数&分配操作员已删除,
无移动约束/assign op。声明,
,也没有隐含的移动约束/ASSIGN OP。因为有一个破坏者声明。
当我尝试将其存储在std::vector
中时:
std::vector<Object> objects;
objects.emplace_back();
它给出了一个编译错误,因为对象没有复制构造函数/移动c./etc。
- (需要调整对象时,必须复制/移动到新容器)
但是,当我尝试将其存储在std::map
中时:
std::map<int, Object> objects;
objects.emplace(std::piecewise_construct,
std::make_tuple(1),
std::make_tuple()
);
它运行完美。为什么?
std::map
是基于节点的容器(例如,红黑树)。这些元素存储在内部节点结构中,该结构可以内部移动。要重新定位元素,它只需要更新一些指针,就不需要移动元素本身。
std::vector
将元素存储在连续的缓冲区中。每当缓冲区重新分配时(通常可以足够),就需要移动元素本身。因此,必须这样做。