用std :: vector :: at无效调用std :: move

时间:2019-08-17 16:20:32

标签: c++ move-semantics

我正在检查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。无论如何,都会复制右侧的值。我错了吗?

1 个答案:

答案 0 :(得分:3)

下一条语句删除向量的最后一个元素。 std::vector::at返回一个引用,然后赋值运算符执行一个赋值操作。

如果T实现了移动语义,这将导致向量中的最后一个值被移动分配到位置# idx 中。如果T实现了移动分配运算符,则将使用它。将不进行任何复制,这将使向量的最后一个元素处于某种有效但未指定的状态,然后立即将其从向量中弹出并永久消失。

如果T没有实现move语义,则它将演变为普通的副本/赋值。