即使使用了 auto && 是否仍然需要使用 std move

Is it still necessary to use std move even if auto && has been used

众所周知,STL通常提供两种函数来插入一个元素:insert/push和emplace。

假设我想将所有元素从一个容器放置到另一个容器。

for (auto &&element : myMap)
{
    anotherMap.emplace(element);  // vs anotherMap.empalce(std::move(element));
}

在这种情况下,如果我想调用 emplace 而不是 insert/push,我是否仍然需要在此处调用 std::move

如果您确实想将所有元素从 myMap 移动到 anotherMap,那么是的,您必须调用 std::move()。原因是这里的element还是左值。它的类型是声明的右值引用,但表达式本身仍然是左值,因此重载决议将返回左值引用构造函数,也就是众所周知的复制构造函数。

这是一个很常见的混淆点。例如,参见 问题。

永远记住 std::move 本身实际上并没有做任何事情,它只是保证重载解析器将看到一个适当类型的右值而不是与给定标识符关联的左值。