使用移动插入和复制插入调整 std::vector 的大小

Resizing a std::vector using move insertion and copy insertion

在 C++ 标准中 vector.capacity section, it defines two overloads for resize(). (see also https://en.cppreference.com/w/cpp/container/vector/resize)

此重载要求类型 T 为 MoveInsertableDefaultInsertable:

constexpr void resize(size_type sz);

另一个重载要求类型 T 是 CopyInsertable:

constexpr void resize(size_type sz, const T& c);

我的问题是,为什么第二个重载不尝试从旧向量的现有值 移动 ,并进一步从提供的 c 参数。那不是更有效率吗?

我同意第二个参数可以是一个右值引用——当它随后从第一个新附加的项目中复制时,这会保存一个副本。我假设你的想法是这样的:

std::vector<LargeObject> v;

// ...

LargeObject obj = setupLotsOfResources();

// Now do 1 move and 9 copies instead of 10 copies
v.resize(10, std::move(obj));

但是,我认为这是一种边缘情况,使用用于 1 个移动构造和 N-1 个副本的右值引用非常令人困惑 API。由于您可以自由使用 std::vector API 和已经存在的内容,因此对于上面的示例,您将拥有 1 次移动和 N-1 次复制,我相信现有函数签名背后的基本原理是易于使用和简单明了的签名,不需要大量研究规范就可以理解它的作用。