为什么vector.emplace()要求item为MoveAssignable ?
Why does vector.emplace() require item to be MoveAssignable?
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
将对象放在已经存在另一个对象的位置。这是通过将旧对象移动到下一个位置,然后将新对象移动分配给(现在为空的)旧对象来实现的。
您希望销毁旧对象并在其位置创建新对象,但如果构造失败并出现异常,则会出现问题。这个向量就会有一个洞,它的一个不变量就失效了。
相关文章:
- C++:如何正确设置 "Item" 类
- 数组 X[n] 仅存储名称.编写算法以在数组中插入或删除 ITEM
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- std::vector::erase 的 MoveAssignable 要求与 std::vector::emplace_back 的 MoveInsertable 要求
- 为什么不能从 QVector 将 Item 添加到 QGraphicsScene <QGraphicsItem>中?
- 防止 QGraphicsItem::itemAt() 在"Background Item"上
- 按列进行排序后,如何从qtablewidget :: item(qt bug?)中获取正确的行
- std :: vector :: erase(item)需要为项目定义的分配操作员
- xrces item returning NULL
- Qt - QStringList to QListWidget*item
- 创建"Item"定义
- 未在qgraphicsItem上调用ItemChange.Item会解覆盖标志
- 致命错误 C1083:无法打开包含文件:"Item.h":没有此类文件或目录
- 为什么编译器说我不能将项插入到 std::set 中<Item>?
- QInputDialog.getItem() get item index
- QT QTableWidget::item() 返回 nullptr,即使分配给它的 widget
- 为什么我会收到错误"Array type Item[1000] is not assignable"?
- 在视觉C++中创建"Add New Item Wizard"
- 访问地图的一个"item"
- 为什么vector.emplace()要求item为MoveAssignable ?