C++ utility move 函数

  • 定义和用法

    template <class T>
    typename remove_reference<T>::type&& move (T&& arg) noexcept;
    std::move 返回对arg的右值引用。这是一个辅助函数,用于强制在值上移动语义,即使它们具有名称:直接使用返回的值也会导致arg被视为右值。通常,右值是其地址无法通过解引用获得的值,因为它们是文字或本质上是临时的(例如,函数返回的值或显式构造函数调用)。通过将对象传递给此函数,可以获得引用该对象的右值。标准库的许多组件都实现了移动语义,从而允许直接转移对象的资产和属性的所有权,而在参数为右值时不必复制它们。尽管注意了-在标准库中-移动意味着从中移出的对象处于有效但未指定的状态。这意味着在执行此操作之后,仅应销毁移出对象的值或为其分配新值;否则,将产生未指定的值。该函数返回下面相同:
    
    static_cast<remove_reference<decltype(arg)>::type&&>(arg)
    
    <algorithm>重载了此函数,为范围提供了类似的行为。
  • 参数

    arg
    一个对象。
  • 返回值

    引用arg的右值引用。
  • 示例

    
    // move example
    #include <utility>      // std::move
    #include <iostream>     // std::cout
    #include <vector>       // std::vector
    #include <string>       // std::string
    
    int main () {
      std::string foo = "foo-string";
      std::string bar = "bar-string";
      std::vector<std::string> myvector;
    
      myvector.push_back (foo);                    // copies
      myvector.push_back (std::move(bar));         // moves
    
      std::cout << "myvector contains:";
      for (std::string& x:myvector) std::cout << ' ' << x;
      std::cout << '\n';
    
      return 0;
    }
    
    尝试一下
    第一次调用myvector.push_back会将foo的值复制到向量中(foo保留调用前的值)。 第二次调用将bar的值移到向量中。 这会将其内容传输到向量中(而bar失去其值,并且现在处于有效但未指定的状态)。
    输出
    
    myvector contains: foo-string bar-string
    
  • 数据竞争

    调用此函数不会引起任何数据争用。尽管注意到将返回的值传递给实现移动语义的函数通常涉及修改对象的值或有效性。
  • 异常安全

    这函数不会抛出异常。
  • 相关页面

    forward 转发参数(函数模板)
    move (algorithm) 元素的移动范围(函数模板)