用 std::vector::at 调用 std::move 没用

Useless call std::move with std::vector::at

我正在研究 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。无论如何复制右侧的值。我错了吗?

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

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

如果 T 不实现移动语义,这将退化为正常的 copy/assignment。