日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move

發布時間:2025/3/21 c/c++ 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。