std::move

From cppreference.com
Defined in header <utility>
template< class T >
typename std::remove_reference<T>::type&& move( T&& t );
(since C++11)

std::move obtains an rvalue reference to its argument, which converts it to xvalue.

Library code that's passed an rvalue (either prvalue such as a temporary object or xvalue such as the one produced by std::move) that identifies a resource-owning object has the option (but isn't required) to move the resource out of the argument in order to run more quickly, leaving the argument with an empty value. The library code is required to leave a valid value in the argument, but unless the type or function documents otherwise, there are no other constraints on the resulting argument value. This means that it's generally wisest to avoid using a moved from argument again. If you have to use it again, be sure to re-initialize it with a known value before doing so.

Contents

[edit] Parameters

t - the object to be moved

[edit] Return value

static_cast<typename std::remove_reference<T>::type&&>(t)

[edit] Exceptions

noexcept specification:  
noexcept
  (since C++11)

[edit] Example

#include <iostream>
#include <utility>
#include <vector>
#include <string>
 
int main()
{
    std::string str = "Hello";
    std::vector<std::string> v;
 
    // uses the push_back(const T&) overload, which means 
    // we'll incur the cost of copying str
    v.push_back(str);
    std::cout << "After copy, str is \"" << str << "\"\n";
 
    // uses the rvalue reference push_back(T&&) overload, 
    // which means no strings will copied; instead, the contents
    // of str will be moved into the vector.  This is less
    // expensive, but also means str might now be empty.
    v.push_back(std::move(str));
    std::cout << "After move, str is \"" << str << "\"\n";
 
    std::cout << "The contents of the vector are \"" << v[0]
                                         << "\", \"" << v[1] << "\"\n";
 
    // string move assignment operator is often implemented as swap,
    // in this case, the moved-from object is NOT empty
    std::string str2 = "Good-bye";
    std::cout << "Before move from str2, str2 = '" << str2 << "'\n";
    v[0] = std::move(str2);
    std::cout << "After move from str2, str2 = '" << str2 << "'\n";
}

Possible output:

After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"
Before move from str2, str2 = 'Good-bye'
After move from str2, str2 = 'Hello'

[edit] Complexity

Constant

[edit] See also

(C++11)
forwards a function argument
(function template)
obtains an rvalue reference if the move constructor does not throw
(function template)
(C++11)
moves a range of elements to a new location
(function template)