最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11?右值引用的使用場景分析

 更新時間:2025年06月09日 10:54:09   作者:unlockjy  
c++11中新增了右值引用的語法,本文主要說明左值引用和右值引用的使用場景,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

前言

c++11中新增了右值引用的語法,本章主要說明左值引用和右值引用的使用場景

在我們了解左值引用和右值引用前,我們要先來理解一下左值和右值分別是什么

1.左值and右值

左值是一個表示數(shù)據(jù)的表達式,我們可以獲取它的地址,有持久狀態(tài)存儲在內(nèi)存當中,變量名,指針等,只要是可以取到地址的表達式都是左值

右值也是一個數(shù)據(jù)表達式,一般是字面常量或者創(chuàng)建的臨時對象

核心區(qū)別:是否可以拿到地址,可以取地址就是左值 取不到地址就是右值

 2.左值引用and右值引用

我們知道引用其實就是起了一個別名 左值引用和右值引用也就是起別名

一個& 就是左值引用 兩個&&就是右值引用

注意:左值引用不能直接引用右值 const左值可以引用右值

右值引用不能直接引用左值 右值引用可以引用move(左值)

move是一個函數(shù) 底層我們可以理解就是將左值強轉成右值 但它的屬性還是左值

引用可以延長生命周期

我們知道臨時變量的生命周期很短,只有執(zhí)行的那一行代碼

const左值可以延長生命周期 右值引用可以延長生命周期

但是普通左值引用不可以延長生命周期,這是因為臨時對象是右值,普通左值引用綁定右值,就可能會出現(xiàn)對已經(jīng)銷毀的對象做無效引用

注意:這里的延長生命周期是只在當前的棧幀有效,一旦函數(shù)運行完畢,進行釋放,被延長的生命周期的臨時對象也就被銷毀了,延長的生命周期只在當前的作用域有效?。。?!

3.參數(shù)匹配

c++98當我們實現(xiàn)一個const左值引用作為參數(shù),那么傳左值和右值都可以

c++11新增了右值引用,當我們進行傳參,編譯器就會找到相對最匹配的函數(shù)繼續(xù)傳參?。?/p>

右值引用變量在用于表達式的時候屬性是左值

4.左值引用和右值引用的使用場景

左值引用的使用場景:

當函數(shù)的參數(shù)是左值引用 可以減少拷貝 因為它只是一個別名 左值引用傳返回值得到時候 也可以減少拷貝 也可以修改實參 左值引用可以解決大量的拷貝效率問題 但是有些場景不能使用傳左值引用返回

我們來舉個例子  就是如果在當前棧幀中創(chuàng)建臨時對象,我們就需要傳值返回,這種消耗是很大的!

在c++11 右值引用還沒有出來時,編譯器對此進行了優(yōu)化,不同的編譯器優(yōu)化可能不同

我們來看一下編譯器優(yōu)化 雖然說最終優(yōu)化只有一次構造 但是還是有構造 會造成資源消耗

還有一種情況 拷貝構造+拷貝賦值

針對于以上的這種情況 我們使用C++11的右值使用就可以很好的解決這個問題

5.移動構造和移動賦值

移動構造類似拷貝構造,移動構造函數(shù)的第一個參數(shù)必須是該類類型的右值引用

這個構造不同于拷貝構造,拷貝構造會進行深拷貝,移動構造是資源進行轉移??!不會進行深拷貝

// 移動構造
string(string&& s)
{
cout << "string(string&& s) -- 移動構造" << endl;
swap(s);
}

就上述場景來看,無論編譯器怎么優(yōu)化,最終還是有一次拷貝,但c++11引入了右值引用,就可以很好的解決這個問題,這里的swap就是進行資源轉移

移動賦值是賦值運算符重載 移動賦值函數(shù)要求第一個參數(shù)必須是該類型的右值引用

它的本質(zhì)也是進行資源轉移 并不會進行深拷貝,這樣就可以減少深拷貝 提高資源利用效率

/// 移動賦值
string& operator=(string&& s)
{
    cout << "string& operator=(string&& s) -- 移動賦值" << endl;
    swap(s);
    return *this;
}

6.引用折疊and萬能引用

C++11中不可以直接將左值引用和右值引用寫在一起 int& && x = i; 這種寫法是錯誤的

我們需要通過模版或者typedef的操作 構成引用的引用

C++11規(guī)定 右值引用的右值引用折疊后是右值引用 其他的組合折疊后都是左值引用

我們通過一些例子來理解一下:

萬能引用其實就是一個模版 將參數(shù)設計成T&& 既可以接受左值引用又可以接受右值引用

template<class T>
void Function(T&& t)
{
    Fun(t);
}

7.完美轉發(fā)

完美轉發(fā)的核心要點就是保持當前對象的屬性

template<class T>
void Function(T&& t)
{
    //Fun(t);
    Fun(forward<T>(t));
}

完美轉發(fā)的使用場景:我們知道變量表達式都是左值屬性 當一個右值被右值引用綁定后 右值引用變量表達式的屬性是左值 Function的t的屬性是左值 將t傳給Fun,那么只會匹配左值引用的Fun函數(shù),代碼結果就會出現(xiàn)錯誤 這個時候我們就需要使用完美轉發(fā)保持t的屬性 

完美轉發(fā)forward的本質(zhì)是一個函數(shù)模版,核心是通過引用折疊實現(xiàn) 如果說傳給Function的實參是右值 T被推導int,不進行折疊,forward內(nèi)部t被轉換成右值引用進行返回 如果說傳給Function的實參是左值,T被推導int&,引用折疊左值引用,forward內(nèi)部t被強轉為左值引用返回

到此這篇關于C++11 右值引用的文章就介紹到這了,更多相關C++11 右值引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現(xiàn)Dijkstra算法的示例代碼

    C++實現(xiàn)Dijkstra算法的示例代碼

    迪杰斯特拉算法(Dijkstra)是由荷蘭計算機科學家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是從一個頂點到其余各頂點的最短路徑算法。本文將用C++實現(xiàn)Dijkstra算法,需要的可以參考一下
    2022-07-07
  • 使用C++的inipp庫處理配置文件.ini的示例詳解

    使用C++的inipp庫處理配置文件.ini的示例詳解

    一個ini文件由多個節(jié)section組成,每個節(jié)由多個鍵值對組成,本文給大家介紹了使用第三方庫inipp來操作ini文件,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-01-01
  • c++實現(xiàn)二路歸并排序的示例代碼

    c++實現(xiàn)二路歸并排序的示例代碼

    這篇文章主要介紹了c++實現(xiàn)二路歸并排序的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • C++深入分析講解鏈表

    C++深入分析講解鏈表

    當我們在寫一段代碼時,如果要頻繁的在一塊區(qū)域進行插入或者刪除操作時,會發(fā)現(xiàn)用數(shù)組實現(xiàn)會比較復雜,這時候我們就要用另一種數(shù)據(jù)結構,鏈表來實現(xiàn)
    2022-06-06
  • C語言實現(xiàn)動態(tài)版通訊錄的示例代碼

    C語言實現(xiàn)動態(tài)版通訊錄的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C語言實現(xiàn)一個簡單的動態(tài)版通訊錄,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,需要的可以參考一下
    2022-08-08
  • C++的動態(tài)內(nèi)存管理你真的了解嗎

    C++的動態(tài)內(nèi)存管理你真的了解嗎

    這篇文章主要為大家詳細介紹了C++的動態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++11?nullptr實現(xiàn)初始化空指針

    C++11?nullptr實現(xiàn)初始化空指針

    避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下
    2022-01-01
  • C++定時器Timer在項目中的使用方法

    C++定時器Timer在項目中的使用方法

    這篇文章主要給大家介紹了關于C++定時器Timer在項目中的基本使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • C++ OpenCV學習之圖像像素值統(tǒng)計

    C++ OpenCV學習之圖像像素值統(tǒng)計

    在圖像分析的時候,我們經(jīng)常需要對單通道圖像的像素進行統(tǒng)計。本文將主要介紹利用C++ OpenCV實現(xiàn)的圖像像素值統(tǒng)計的幾種方法,需要的可以參考一下
    2022-01-01
  • C++中std::thread{}和std::thread()用法

    C++中std::thread{}和std::thread()用法

    std::thread{}和std::thread()在C++中都可以用于創(chuàng)建線程對象,但std::thread{}作為C++11引入的統(tǒng)一初始化,更推薦使用,因為它更安全、更易讀,且避免了隱式類型轉換
    2024-11-11

最新評論

沈阳市| 云梦县| 尤溪县| 康平县| 黎川县| 富宁县| 阳曲县| 浑源县| 牡丹江市| 临泽县| 林西县| 定西市| 华池县| 崇信县| 麻栗坡县| 清河县| 通榆县| 蚌埠市| 盐边县| 禹城市| 浦东新区| 大悟县| 拜泉县| 曲周县| 三台县| 金坛市| 旬邑县| 诏安县| 辽宁省| 社会| 保靖县| 大连市| 普定县| 义乌市| 阿巴嘎旗| 嘉禾县| 亚东县| 乌鲁木齐县| 海南省| 镇远县| 长顺县|