Search code examples
c++11stlmoveemplace

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


As we know, STL usually offered two kinds of functions to insert an element: insert/push and emplace.

Let's say I want to emplace all of elements from one container to another.

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

In this case, if I want to call the emplace, instead of insert/push, must I still call std::move here or not?


Solution

  • If you indeed want to move all elements from myMap into anotherMap then yes you must call std::move(). The reason is that element here is still an lvalue. Its type is rvalue reference as declared, but the expression itself is still an lvalue, and thus the overload resolution will give back the lvalue reference constructor better known as the copy constructor.

    This is a very common point of confusion. See for example this question.

    Always keep in mind that std::move doesn't actually do anything itself, it just guarantees that the overload resolver will see an appropriately-typed rvalue instead of an lvalue associated with a given identifier.