C++ Primer 筆記——理解std::move

標準庫move函數是使用右值引用的模板的一個很好的例子。標準庫是這樣定義std::move的:函數

template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
    return static_cast<typename remove_reference<T>::type&&>(t);
}

 

咱們考慮以下代碼的工做過程:rem

std::string s1("hi"), s2;
s2 = std::move(string("hi"));    // 正確,從一個右值移動數據
s2 = std::move(s1);                // 正確,可是在賦值以後,s1的值是不肯定的


在第一個賦值中,實參是string類型的右值,所以過程爲:string

  • 推斷T的類型爲 string
  • remove_reference<string> 的 type 成員是 string
  • move 返回類型是 string&&
  • move 的函數參數t的類型爲 string&&

所以,這個調用實例化 move<string>,即函數ast

string&& move(string &&t)


在第二個賦值中,實參是一個左值,所以:模板

  • 推斷T的類型爲 string&
  • remove_reference<string&> 的 type 成員是 string
  • move 返回類型是 string&&
  • move 的函數參數t的類型爲 string& &&,會摺疊成 string&

所以,這個調用實例化 move<string&>,即引用

string&& move(string &t)

 

  一般狀況下,static_cast 只能用於其餘合法的類型轉換。可是有一條針對右值的特許規則:雖然不能隱式的將一個左值轉換成右值引用,但咱們能夠用static_cast顯示的將一個左值轉換爲一個右值。數據

相關文章
相關標籤/搜索