C++11新特性 | 歡迎來到現代C++的世界!

左值與右值

左值與右值的概念

可以被取地址的值為左值(left value,簡稱lvalue),否則為右值(right value,簡稱rvalue)。
常見的左值、右值例子:

// >>>>>>> 左值
// a, p, str, str[0]等均為左值
int a = 10;
int* p = &a;
string str("hello");
str[0]// >>>>>>> 右值
// 匿名對象,臨時表達式,常量10、“world”,均為右值
string("world")
x + y
10

初步認識左值和右值時,可以理解記憶為左值存儲在內存中,具有“身份”,生命周期長。右值存儲在寄存器中,大多為臨時變量,生命周期短。

但實際上,不完全是這樣:可能存在被編譯器優化為存儲于寄存器的左值(臨時變量),也有占用空間較大,需要存儲于內存的臨時副本(如復雜匿名對象)。初步認識時可以幫助理解move()將左值轉換為右值的行為,類似匯編中的mov命令。

右值引用

語法為使用&&,例如:

int&& a;
char&& b;

特性:

  1. 左值引用不能直接引用右值,除非加const限定;右值引用也不能直接引用左值,需要使用move()處理左值。
  2. 右值引用本身是一個左值。

移動構造

語法規則

class class_name {
public:class_name(class_name&& t) {::swap(t, t.array);    // 交換資源}private:int* array;
}

意義

右值引用的概念與移動構造等特性密切相關,C++11提供了一種提高程序效率的方式,通過交換臨時資源的指針代替拷貝。

對于下面這一段程序:

string func() {string tmp("1111111111111");return tmp;
}int main() {string str = func();...
}

取決于編譯器的不同優化方式,C++98標準下,實際的程序會有三種行為:

  1. 在func內調用構造函數得到tmp,傳值返回時調用構造,得到臨時對象,然后拷貝賦值給str;
  2. 省略臨時對象的構造,直接將tmp拷貝賦值給str;
  3. 省略tmp的構造,直接用"1111111111111"構造str;

移動構造出現后就能夠替代拷貝構造,降低拷貝時的資源消耗。因為對于整個程序來說,tmp的存在只是暫時的【實際會被視為將亡值】,其資源被轉移給str也無所謂,所以不用進行拷貝,直接交換資源,就能達成相同的效果。

引用折疊

基本規則

類似“&”與運算,要右值引用的右值引用最終才是右值引用。

typedef int& lref
typedef int&& rref
lref&  a  -> a的類型為int&
lref&& b  -> b的類型為int&
rref&  c  -> c的類型為int&
rref&& d  -> d的類型為int&&

TIP: 不能直接寫int& &&int& &,即不能直接對引用再做引用,必須通過typedef自定義類型才可以,否則會語法報錯。

完美引用

借用“引用折疊”的規則,可以統一模版的寫法,使得最終的類型完全由實例化時的類型決定。萬能模版寫法:

tempate<class T>
void func(T&& a) {...
}func<int&> f1(num1)  // 最終a要求為一個左值,因此num1需要是左值
func<int&&> f2(num2) // 最終a要求為一個右值,因此num2需要是右值

完美轉發

forward<typename>(arg);

為避免右值被右值引用后變為左值,調用該函數,可以保持參數arg的原始屬性。

例子:

void overload(int&& rv) { std::cout << "rv " std::endl; }
void overload(int& lv) { std::cout << "lv" std::endl; }void func(int&& v) {overload(v);overload(std::forwad<int>(v));
}
  • 當調用func時輸入左值,將會得到輸出:lv lv
  • 當調用func時輸入右值,將會輸出:lv rv

意義

完美引用結合完美轉發,可以運用在模版的嵌套場景,可以有效避免代碼冗余,同時提高代碼效率。

Lambda表達式

本質

lambda表達式的本質是一個匿名函數對象,可以直接定義在函數內部。

語法

// [capture list] (parameters) -> retrun type (function body)int main() {auto test1 = [](int a) -> void {cout << a << endl;return 0;}test1(1);return 0;
}
  1. 捕捉列表(capture list)不能省略
  2. 如果參數為空,則可以省略
  3. 即使有返回值,返回值類型也可以省略,將會由返回對象自動推導
  4. 函數體不能省略(必然的)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95386.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

因為對象裝箱拆箱導致的空指針異常

今天業務突然提了個事件單&#xff0c;客戶添加承租人一直報錯&#xff0c;但是很奇怪&#xff0c;報錯信息是空的二話不說&#xff0c;先跟API組要了接口和參數&#xff0c;然后看日志然鵝&#xff0c;這個接口并沒有打印日志&#xff0c;只有一個e.printStackTrace()然后靜下…

Rust 在 Windows 環境下交叉編譯其他操作系統可執行文件的詳細指南

前言&#xff1a;為什么需要交叉編譯&#xff1f; 想象一下這樣的場景&#xff1a;你在 Windows 電腦上開發了一個 Rust 程序&#xff0c;希望它能在 Linux 服務器上運行&#xff0c;或者在朋友的 macOS 電腦上測試 —— 總不能為了編譯不同系統的版本&#xff0c;專門買一臺 …

Ubuntu系統配置鏡像源

要修改的文件 /etc/apt/sources.list操作步驟 1. 備份原文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2. 編輯文件 sudo nano /etc/apt/sources.list3. 清空文件內容&#xff0c;填入以下內容 先獲取Ubuntu版本代號&#xff1a; lsb_release -cs然后根據版本填…

【Spring Cloud Alibaba】Sentinel(一)

【Spring Cloud Alibaba】Sentinel&#xff08;一&#xff09;1. 簡介2. 服務雪崩1. 簡介 Sentinel 是阿里巴巴開源的分布式系統的流量防護組件&#xff0c;主要用來做流量控制、熔斷降級、系統保護。它的定位類似于 Hystrix&#xff0c;但更側重在 流量治理 上。目前在微服務…

Delphi 5 操作Word表格選區問題解析

在 Delphi 5 中操作 Word 時&#xff0c;您遇到的 Selection.MoveDown 方法選中整行而不是僅移動一行的原因與 Word 的選擇機制和單元格內部結構有關。以下是詳細解釋和解決方案&#xff1a;問題分析單元格的選區范圍&#xff1a;當使用 .Cell(r, c).Select 選中單元格時&#…

小米fastboot不能被電腦識別但手機正常使用模式時能被電腦識別

小米手機USB連接電腦不識別解決方法 – MIUI歷史版本 小米手機USB連接電腦不識別解決方法 問題經驗 手機連接電腦通常會自動安裝驅動&#xff0c;如果驅動安裝失敗或是電腦不能識別手機設備&#xff0c;可嘗試下面方法。 1. 嘗試換根 USB 數據線&#xff0c;最好是手機原…

Git 版本管理工具基本操作匯總—命令總結

通常&#xff0c;很多朋友在使用 Git 的時候都會直接用 IDE 中集成的插件或者自帶的工具等來實現代碼的拉取、提交、合并以及其他操作&#xff0c;當然這肯定也是可以的&#xff0c;但是長期這樣子操作&#xff0c;我們就會忽略掉 Git 業務運行的底層邏輯。那么&#xff0c;我這…

自學嵌入式第三十三天:網絡編程-UDP

一、OSI模型(open system interconnect)開放系統互聯模型&#xff0c;分為7層應用層&#xff1a;為網絡用戶提供各種服務&#xff0c;例如電子郵件、文件傳輸等&#xff1b;表示層&#xff1a;為不同主機間的通信提供統一的數據表示形式。加密解密&#xff0c;壓縮&#xff1b;…

A*(Astar)算法詳解與應用

算法背景A*&#xff08;A-Star&#xff09;算法是一種在圖形平面上&#xff0c;有多個節點的路徑中&#xff0c;求出最低通過成本的算法。其歷史可以追溯到早期的圖搜索算法&#xff0c;如Dijkstra算法和貪心最佳優先搜索&#xff08;Greedy Best-First Search&#xff09;。是…

word刪除指定頁面

常規程序因為wps的 .docx 文件是基于段落和節的結構&#xff0c;而不是“物理頁”&#xff0c;所以無法直接按“第幾頁”刪除在普通程序里面無法讀取到他的頁碼&#xff0c;但是在宏編程里面他能讀取到頁碼&#xff0c;我們就根據宏編程來這樣刪除。程序會自動打開選擇要刪除的…

RK3568平臺開發系列講解:瑞芯微平臺4G模塊篇移植

更多內容可以加入Linux系統知識庫套餐(教程+視頻+答疑) ??返回專欄總目錄 文章目錄 一、硬件圖片 二、功能宏 三、增加PID/VID 支持 3.1、usb_device_id 結構體 3.2、usb_device_id 的注冊 沉淀、分享、成長,讓自己和他人都能有所收獲!?? 一、硬件圖片 目標: 結果…

面試 (一)

目錄 1. HashMap是怎么解決沖突的 是用什么數據結構實現的 2. 為什么hashmap的初始長度為16 3. 多線程的核心參數 4. 多線程怎么工作的 5. CISCS是怎么實現的 6. JUC知識 7. C和java的區別 8. JVM底層編譯的東西 9. 公平鎖和非公平鎖 10. 有人惡意攻擊你的平臺每秒發送…

計算機畢設選題:基于Python+Django的健康飲食管理系統設計【源碼+文檔+調試】

精彩專欄推薦訂閱&#xff1a;在 下方專欄&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二…

vscode terminal遠程連接linux服務器GUI圖形界面

看了很多教程&#xff0c;不清楚具體原理&#xff0c;但總之自己是摸索出來了&#xff1a; 1.下載vcxsrv&#xff0c;最后雙擊exe程序啟動&#xff1a; 每一步的配置如下&#xff1a;2.修改配置 vscode中按下“ctrlshiftp”&#xff0c;然后輸入“Remote-SSH: Open SSH Configu…

文檔外發管理產品哪個品牌強?安全與效率雙優產品推薦

在企業間協作日益加深的今天&#xff0c;企業對文檔外發管理相關產品的安全性和效率要求越來越高。無論是日常業務協作&#xff0c;還是跨組織數據交換&#xff0c;如何確保文件在傳輸過程中不被泄露、篡改&#xff0c;同時又能高效流轉&#xff0c;成為企業IT管理的重要課題。…

【教程】2025 IDEA 快速創建springboot(maven)項目

第一步&#xff1a;【新建】-【module】&#xff0c;左邊選擇springboot&#xff0c;右邊填寫相關信息。第二步&#xff1a;選擇相關依賴。第三步&#xff1a;刪掉一些無關的文件&#xff0c;保持項目簡潔創建springboot項目已經結束了&#xff0c;下面是構建項目的架構以及環境…

【小白筆記】移動硬盤為什么總比電腦更容易滿?

我明明只復制了10個G的文件&#xff0c;為什么我的移動硬盤就滿了&#xff1f; 大家好&#xff0c;我是個剛入門的小白&#xff0c;最近遇到了一個讓我百思不得其解的問題。我把電腦里的一些文件&#xff0c;總共加起來也就10個G左右&#xff0c;心想移動硬盤還有幾十個G的空位…

單獨一篇云原生介紹

云原生&#xff08;Cloud Native&#xff09;?不是單一技術&#xff0c;而是一套構建和運行應用程序的完整方法論?&#xff0c;旨在充分利用云計算的優勢&#xff08;彈性、按需資源、分布式環境&#xff09;來構建?高韌性、可擴展、易于管理的應用?。它的核心思想是讓應用…

Git如何查看提交行數與刪除行數:統計代碼貢獻量的完整指南

Git如何查看提交行數與刪除行數&#xff1a;統計代碼貢獻量的完整指南 在軟件開發中&#xff0c;代碼行數統計是衡量團隊協作效率和項目進度的重要指標。通過Git的命令行工具&#xff0c;開發者可以輕松查看提交的代碼行數、刪除的代碼行數以及凈增行數。本文將詳細介紹多種方…