C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
1. 標準庫定義
/ / 在返回類型和類型轉換中也要用到 typename, 參見 16.1.3 節( 第 593 頁 )
reference 是在 16.2.3 節( 第 605 頁 ) 中介紹的
template typename remove reference::type&& move (T && t )
{
// static_cast 是在 4.11.3 節( 第 145 頁 ) 中介紹的
return static_cast<typename remove reference::type&&> (t);
}
move 的函數參數 T &&是一個指向模板類型參數的右值引用。 通過引用折疊, 此參數可以與任何類型的實參匹配。 特別是, 我們既可傳遞給 move—個左值, 也可以傳遞給它一個右值
string si (“hi!”), s2;
s2=std::move (string (“bye!” ) ); // 正確: 從一個右值移動數據
s2=std::move(si); // 正確: 但在賦值之后 , si 的值是不確定的
1.1 s2=std::move (string (“bye!” ) );
- 推斷出 T 的類型為 string。
- remove_reference 用 string 進行實例化。
- reference type 成員是 string。
- move返回類型是 string&&。
- move的函數參數 t 的類型為 string& &。
因此, 這個調用實例化 move, 即函數string && move (string &&t )
1.2 s2=std::move(si);
- 推斷出T的類型為 string& (string 的引用, 而非普通 string)。
- remove—reference 用 string&進行實例化。
- remove_reference<string&>的 type 成員是 string。
- move的返冋類型仍是 string& &。
- move的函數參數 t 實例化為 string& & & , 會折疊為 string&。
因此, 這個調用實例化 move<string&>, 即string && move (string &t )
從一個左值 static_cast 到一個右值引用是允許的
-
通常情況下, static_cast 只能用于其他合法的類型轉換( 參見 4.11.3 節, 第 145頁)。 但是, 這里又有一條 對右值引用的特許規則: 雖然不能隱式地將一個左值轉換為右值引用, 但我們可以用 static_cast 顯式地將一個左值轉換為一個右值引用。
-
對于操作右值引用的代碼來說, 將一個右值引用綁定到一個左值的特性允許它們截斷左值。 有時候, 例如在我們的 StrVec 類的 reallocate 函數( 參見 13.6.1 節, 第 469頁) 中, 我們知道截斷一個左值是安全的。 一方面, 通過允許進行這樣的轉換, C++語言認可了這種用法。 但另一方面, 通過強制使用 static_cast, C++語言試圖阻止我們意外地進行這種轉換。
最后, 雖然我們可以直接編寫這種類型轉換代碼, 但使用標準庫 move 函數是容易得多的方式。 而且, 統一使用 std::move 使得我們在程序中查找潛在的截斷左值的代碼變得很容易
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EOS 智能合约源代码解读 (9)boo
- 下一篇: C++ Primer 5th笔记(cha