在研究 constexpr 类向量容器的想法时,我遇到了愚蠢的 small_vector 容器。我正在阅读实现,并对以下部分感到困惑moveObjectsRightAndCreate
:
for (; in != first && out > lastConstructed;) {
// Out must be decremented before an exception can be thrown so that
// the rollback guard knows where to start.
--out;
new (out) T(std::move(*(--in)));
}
for (; in != first;) {
--out;
*out = std::move(*(--in));
}
for (; out > lastConstructed;) {
--out;
new (out) T(create());
}
for (; out != first;) {
--out;
*out = create();
}
我的理解是:对于内存未初始化的数组部分,他们使用placement new with std::move
。对于先前从其中移动对象的数组部分,它们使用移动分配。
似乎主要区别在于是否使用移动构造函数或移动赋值,但我不确定我是否理解这些选择的含义。为什么不对这两种情况都使用placement new?为什么不对这两种情况使用移动分配?因为我们知道数组的大小,所以无论如何我们都不会在未初始化的内存上调用析构函数,对吧?