我正在检查Packt Publishing提供的有关C ++ 17功能的课程。 在有关STL容器的第一次演讲中,我遇到了下一段代码:
template <typename T>
void quick_remove_at(std::vector<T> &v, std::size_t idx)
{
if (idx < v.size()) {
v.at(idx) = std::move(v.back());
v.pop_back();
}
}
我不知道为什么使用std::move
。无论如何,都会复制右侧的值。我错了吗?
答案 0 :(得分:3)
下一条语句删除向量的最后一个元素。 std::vector::at
返回一个引用,然后赋值运算符执行一个赋值操作。
如果T
实现了移动语义,这将导致向量中的最后一个值被移动分配到位置# idx 中。如果T
实现了移动分配运算符,则将使用它。将不进行任何复制,这将使向量的最后一个元素处于某种有效但未指定的状态,然后立即将其从向量中弹出并永久消失。
如果T
没有实现move语义,则它将演变为普通的副本/赋值。