函数模板
<utility>

std::move

template <class T>typename remove_reference<T>::type&& move (T&& arg) noexcept;
作为右值移动
返回 arg 的一个右值引用

这是一个辅助函数,用于强制对值进行移动语义,即使它们有名称:直接使用返回的值会导致 arg 被视为一个右值

通常,右值是其地址无法通过解引用获得的那些值,因为它们是字面量,或者它们是临时的(例如由函数返回的值或显式的构造函数调用)。通过将对象传递给此函数,可以获得一个引用它的右值

标准库的许多组件都实现了移动语义,允许在参数是右值时,直接传输对象的资产和属性的所有权,而无需复制它们。

但请注意,在标准库中,移动意味着已移动的对象将处于有效但未指定的状态。这意味着,在此类操作之后,已移动对象的值只应被销毁或分配新值;否则访问它会产生一个未指定的值。

该函数返回与
1
static_cast<remove_reference<decltype(arg)>::type&&>(arg)

头文件<algorithm>重载了这个函数,提供了类似的行为应用于范围。

参数

arg
一个对象。

返回值

引用arg右值引用

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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


数据竞争

调用此函数不会引入数据竞争。
尽管请注意,将返回值传递给实现移动语义的函数通常会修改对象的值或有效性。

异常

无异常保证:此函数从不抛出异常。

另见