我有这堂课:
class Object {
public:
Object();
Object(const Object&) = delete;
Object& operator=(const Object&) = delete;
~Object();
};
默认的复制构造函数& assign operator被删除,
no move constr./assign op。声明,
并且也没有隐含的移动constr./assign op。因为声明了析构函数。
当我尝试将其存储在std::vector
:
std::vector<Object> objects;
objects.emplace_back();
它给出了编译错误,因为Object没有复制构造函数/ move c./etc。
但是当我尝试将其存储在std::map
:
std::map<int, Object> objects;
objects.emplace(std::piecewise_construct,
std::make_tuple(1),
std::make_tuple()
);
完美无缺。为什么?
答案 0 :(得分:3)
std::map
是基于节点的容器(例如,red-black tree)。元素存储在内部节点结构中,地图可以在内部移动。要重新定位元素,只需要更新一些指针,它不需要移动元素本身。
std::vector
将元素存储在连续的缓冲区中。每次重新分配缓冲区(通常都足够)时,需要移动元素本身。所以一定有可能这样。