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

Why does vector.emplace() require item to be MoveAssignable?

本文关键字:item MoveAssignable 要求 vector emplace 为什么      更新时间:2023-10-16

From en.cppreference.com on vector.emplace():

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

emplace_back()不要求T为MoveAssignable

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

class Node
{
public:
    ...
    const std::string mName;
    const AABB mLocalAABB;
    const Mat4 mLocalTransform;
}

由于具有const成员而不能MoveAssignable

为什么emplace()不能像emplace_back()那样在原地创建项?

这可能与主题无关,但最终我想使用emplace()而不是emplace_back()的原因是vector中的所有空间都已提前保留(),并且我想将项目放置到前面。使用emplace_back()和std::reverse()不能工作,因为它还需要项目是MoveAssignable

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

除非您传递end()作为位置,否则emplace将对象放在已经存在另一个对象的位置。这是通过将旧对象移动到下一个位置,然后将新对象移动分配给(现在为空的)旧对象来实现的。

您希望销毁旧对象并在其位置创建新对象,但如果构造失败并出现异常,则会出现问题。这个向量就会有一个洞,它的一个不变量就失效了。