【问题标题】:Is it still necessary to use std move even if auto && has been used即使使用了 auto && 是否仍然需要使用 std move
【发布时间】:2021-08-14 04:29:23
【问题描述】:

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

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

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

在这种情况下,如果我想调用emplace,而不是插入/推送,我是否还必须在这里调用std::move

【问题讨论】:

  • 对于这个简单的例子,你也可以使用move(begin(myMap), end(mayMap), inserter(anotherMap, end(anotherMap)))(在适当的地方插入std::)。

标签: c++11 stl move emplace


【解决方案1】:

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

这是一个非常常见的混淆点。例如,请参阅this 问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2012-04-15
    • 2014-07-31
    • 2018-04-18
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多