函式模板
<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


資料競爭

呼叫此函式不會引入資料競爭。
儘管請注意,將返回值傳遞給實現移動語義的函式通常會修改物件的值或有效性。

異常

無異常保證:此函式從不丟擲異常。

另見