为什么vector.emplace()需要item为MoveAssignable?

Kai*_*aan 3 c++ vector

来自en.cppreference.com的vector.emplace():

T(容器的元素类型)必须满足MoveAssignable,MoveInsertable和EmplaceConstructible的要求.

然而,emplace_back()不需要T为MoveAssignable.

我的问题是我有这样的项目 -

class Node
{
public:
    ...

    const std::string mName;
    const AABB mLocalAABB;
    const Mat4 mLocalTransform;
}
Run Code Online (Sandbox Code Playgroud)

由于拥有const成员,因此不是MoveAssignable.

为什么emplace()不能像emplace_back()一样就地创建项目?

它可能是偏离主题但最终我想在emplace_back()上使用emplace()的原因是向量中的所有空间都已提前保留()并且我想要将项目从前到后放置.使用emplace_back()然后使用std :: reverse()不起作用,因为它还需要项目为MoveAssignable.

Ben*_*ley 5

vector::emplace可以将项目放在向量中的任意位置.为了做到这一点,它需要将所有从插入点开始的对象移回1个空格,以便为新元素腾出空间.它使用移动赋值运算符移动它们,因此需要移动可分配.