左值引用(Lvalue Reference)和右值引用(Rvalue Reference)詳解

左值引用(Lvalue Reference)和右值引用(Rvalue Reference)詳解

文章目錄

  • 左值引用(Lvalue Reference)和右值引用(Rvalue Reference)詳解
    • 1. 什么是左值和右值?
      • 左值(Lvalue)
      • 右值(Rvalue)
    • 2. 左值引用(`T&`)
      • 左值引用的定義
      • 特點
    • 3. 右值引用(`T&&`)
      • 右值引用的定義
      • 特點
    • 4. 左值引用和右值引用的對比
    • 5. 結合使用左值引用和右值引用
      • 示例:函數重載
    • 6. 常見使用場景
      • 6.1. 移動語義
      • 6.2. 完美轉發
    • 7. 總結

C++ 中的 引用(Reference) 是變量的別名,分為兩種:

  1. 左值引用(Lvalue Reference):T&
    • 用于綁定到左值。
    • 可以讀取或修改綁定的對象。
  2. 右值引用(Rvalue Reference):T&&
    • 用于綁定到右值。
    • 通常用于轉移資源(實現移動語義)或延長右值的生命周期。

1. 什么是左值和右值?

左值(Lvalue)

左值是指 在程序中有持久存儲地址的對象。通常:

  • 左值可以被取地址(& 操作符)。
  • 左值可以出現在賦值語句的左側。

示例:

int x = 10;  // x 是左值,存儲在內存中,有地址
x = 20;      // 可以修改左值

右值(Rvalue)

右值是指 臨時對象或沒有存儲地址的值。通常:

  • 右值不能被取地址(& 操作符無效)。
  • 右值通常是表達式的結果或字面值(如 42)。

示例:

int y = 42;       // 42 是右值,不能取地址
int z = x + 10;   // x + 10 是右值,計算結果的臨時對象

2. 左值引用(T&

左值引用的定義

  • 左值引用(T&)是綁定到左值的一種引用。
  • 它是左值的別名,可以通過引用對原對象進行修改。

語法:

int x = 10;       // 左值
int& ref = x;     // ref 是 x 的引用
ref = 20;         // 修改 ref 等同于修改 x

特點

  1. 左值引用只能綁定到左值。
  2. 引用本身不是對象,沒有地址。

示例:

#include <iostream>
using namespace std;int main() {int x = 10;int& ref = x;       // ref 是 x 的左值引用ref = 20;           // 修改 ref 等于修改 xcout << x << endl;  // 輸出: 20return 0;
}

3. 右值引用(T&&

右值引用的定義

  • 右值引用(T&&)是綁定到右值的一種引用。
  • 它可以延長右值的生命周期,允許在右值上執行操作。

語法:

int&& ref = 42;  // ref 是右值引用,綁定到右值 42

特點

  1. 右值引用只能綁定到右值。
  2. 用于延長臨時對象的生命周期。
  3. 常見于移動語義和完美轉發。

示例:延長右值生命周期

#include <iostream>
using namespace std;int main() {int&& ref = 42;       // ref 是右值引用,綁定到臨時對象 42cout << ref << endl;  // 輸出: 42ref = 100;            // 修改 ref,也修改了臨時對象cout << ref << endl;  // 輸出: 100return 0;
}

4. 左值引用和右值引用的對比

特性左值引用(T&右值引用(T&&
綁定對象類型左值右值
是否延長生命周期
用途用于修改左值用于移動語義、優化性能、延長右值生命周期
示例int& ref = x;int&& ref = 42;

5. 結合使用左值引用和右值引用

C++11 引入右值引用后,開發者可以通過重載實現更高效的操作。

示例:函數重載

#include <iostream>
using namespace std;// 左值引用版本
void process(int& x) {cout << "左值引用: " << x << endl;
}// 右值引用版本
void process(int&& x) {cout << "右值引用: " << x << endl;
}int main() {int a = 10;process(a);     // 調用左值引用版本process(42);    // 調用右值引用版本process(a + 1); // 調用右值引用版本return 0;
}

輸出

左值引用: 10
右值引用: 42
右值引用: 11

6. 常見使用場景

6.1. 移動語義

右值引用常用于轉移資源,避免拷貝,提高性能。

示例:右值引用和 std::move

#include <iostream>
#include <vector>
#include <utility> // std::move
using namespace std;int main() {vector<int> vec1 = {1, 2, 3};vector<int> vec2 = std::move(vec1); // 轉移 vec1 的資源到 vec2cout << "vec1 size: " << vec1.size() << endl; // 輸出: 0cout << "vec2 size: " << vec2.size() << endl; // 輸出: 3return 0;
}

6.2. 完美轉發

右值引用結合模板,用于實現完美轉發。

示例:完美轉發

#include <iostream>
using namespace std;void process(int& x) {cout << "左值引用: " << x << endl;
}void process(int&& x) {cout << "右值引用: " << x << endl;
}template <typename T>
void forward_to_process(T&& arg) {process(std::forward<T>(arg)); // 保持原始的左值或右值屬性
}int main() {int a = 10;forward_to_process(a);    // 左值引用forward_to_process(42);   // 右值引用return 0;
}

7. 總結

特性左值引用(T&右值引用(T&&
綁定的對象左值右值
用途修改左值延長右值生命周期、實現移動語義
性能需要拷貝數據避免拷貝,直接轉移資源
使用場景常規引用操作移動語義、完美轉發、高效處理臨時對象

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

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

相關文章

探索數據存儲的奧秘:深入理解B樹與B+樹

key value 類型的數據紅黑樹&#xff08;最優二叉樹&#xff0c;內存最優&#xff09;&#xff0c;時間復雜度&#xff1a;O&#xff08;logn&#xff09;,調整方便&#xff1b;一個結點分出兩個叉B樹一個節點可以分出很多叉數據量相等的條件下&#xff1a;紅黑樹的層數很高&am…

聯邦大語言模型典型系統: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHub

聯邦大語言模型典型系統: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHub 目錄 聯邦大語言模型典型系統: FATE - LLM、FedLLM、FederatedScope - LLM、PrimiHubPEFT 技術及簡單舉例PEFT 技術代碼實現提示詞工程不僅僅在聊天對話框實現,還可以再代碼中實現聯邦大語言模…

L1G5000 XTuner 微調個人小助手認知

使用 XTuner 微調 InternLM2-Chat-7B 實現自己的小助手認知 1 環境配置與數據準備步驟 0. 使用 conda 先構建一個 Python-3.10 的虛擬環境步驟 1. 安裝 XTuner 修改提供的數據步驟 0. 創建一個新的文件夾用于存儲微調數據步驟 1. 創建修改腳本步驟 2. 執行腳本步驟 3. 查看數據…

網絡協議安全的攻擊手法

1.使用SYN Flood泛洪攻擊&#xff1a; SYN Flood(半開放攻擊)是最經典的ddos攻擊之一&#xff0c;他利用了TCP協議的三次握手機制&#xff0c;攻擊者通常利用工具或控制僵尸主機向服務器發送海量的變源端口的TCP SYN報文&#xff0c;服務器響應了這些報文后就會生成大量的半連…

人工智能學習路線全鏈路解析

一、基礎準備階段&#xff08;預計 2-3 個月&#xff09; &#xff08;一&#xff09;數學知識鞏固與深化 線性代數&#xff08;約 1 個月&#xff09;&#xff1a; 矩陣基礎&#xff1a;回顧矩陣的定義、表示方法、矩陣的基本運算&#xff08;加法、減法、乘法&#xff09;&…

Redis 安裝與 Spring Boot 集成指南

安裝 Redis 和將其與 Spring Boot 應用集成是構建高效緩存解決方案的常見步驟。以下是詳細的指南&#xff0c;幫助你在本地環境中安裝 Redis&#xff0c;并在 Spring Boot 項目中配置和使用它。 1. 安裝 Redis Windows 環境 Redis 官方并不直接支持 Windows&#xff0c;但你…

3d打印材料是塑料么?pla petg

3D 打印材料不僅限于塑料&#xff0c;但塑料確實是最常見的材料類型之一。以下是一些常用的3D打印塑料材料的介紹&#xff1a; 1. PLA&#xff08;聚乳酸&#xff09; ? 特點&#xff1a;可生物降解&#xff0c;環保&#xff0c;容易打印&#xff0c;表面光滑。 ? 適用…

linux-磁盤io性能指標!

一. 引文&#xff1a; 平時查看或者監控磁盤io時&#xff0c;基本上都是用的現成的工具/腳本&#xff0c; 對其了解的還是很淺&#xff0c;特參考一些資料整理了下&#xff0c;留個隨筆。 二.磁盤I/O性能指標: 磁盤 I/O 是 Unix/Linux 系統管理中一個非常重要的組成部分。磁盤…

Excel 技巧08 - 如何計算某類(比如紅色背景色)單元格的總和? (★)

本文講了如何在Excel中計算某類(比如紅色背景色)單元格的總和。 1&#xff0c;如何計算某類(比如紅色背景色)單元格的總和&#xff1f; 技巧就是先把它們給標記出來&#xff0c;然后就好統計了。 那么如何找出來呢&#xff1f; 對&#xff0c;就是通過紅色。 按下Ctrl F 點…

awr報告無法生成:常見分析手段

awr報告無法生成:常見分析手段 STATISTICS_LEVEL和OPEN_MODEAWR快照是否能自動生成?AWR快照能否手動生成?日志有無ORA-12751或ORA-32701報錯?MMON進程是否被掛起?排查數據庫隱藏參數分析快照生成錯誤信息分析AWR Snapshot Tracing分析AWR Table Flush是否超時STATISTICS_L…

uni-app無限級樹形組件簡單實現

因為項目一些數據需要樹形展示&#xff0c;但是官網組件沒有。現在簡單封裝一個組件在app中使用&#xff0c;可以無線嵌套&#xff0c;展開&#xff0c;收縮&#xff0c;獲取子節點數據等。 簡單效果 組件TreeData <template><view class"tree"><te…

互聯網架構變遷:從 TCP/IP “呼叫” 到 NDN “內容分發” 的逐浪之旅

本文將給出關于互聯網架構演進的一個不同視角。回顧一下互聯網的核心理論基礎產生的背景&#xff1a; 左邊是典型的集中控制通信網絡&#xff0c;很容易被摧毀&#xff0c;而右邊的網絡則沒有單點問題&#xff0c;換句話說它很難被全部摧毀&#xff0c;與此同時&#xff0c;分…

移遠BC28_opencpu方案_pin腳分配

先上圖&#xff0c;BC28模塊的pin腳如圖所示&#xff1a; 下面看看GPIO的復用管腳 然后我自己整理了一份完整的pin功能列表

Eureka緩存機制

一、Eureka的CAP特性 Eureka是一個AP系統&#xff0c;它優先保證可用性&#xff08;A&#xff09;和分區容錯性&#xff08;P&#xff09;&#xff0c;而不保證強一致性&#xff08;C&#xff09;。這種設計使得Eureka在分布式系統中能夠應對各種故障和分區情況&#xff0c;保…

2025年第三屆“華數杯”國際賽A題解題思路與代碼(Python版)

游泳競技策略優化模型代碼詳解 第一題&#xff1a;速度優化模型 在這一部分&#xff0c;我們將詳細解析如何通過數學建模來優化游泳運動員在不同距離比賽中的速度分配策略。 1. 模型概述 我們的模型主要包含三個核心文件&#xff1a; speed_optimization.py: 速度優化的核…

micro-app【微前端系列教程】禁用樣式隔離

全局禁用樣式隔離 所有應用的樣式隔離都會停止 import microApp from micro-zoe/micro-appmicroApp.start({disableScopecss: true, // 默認值false })指定子應用取消禁用樣式隔離 <micro-app namexx urlxx disableScopecssfalse></micro-app>指定子應用禁用樣式…

深度學習筆記11-優化器對比實驗(Tensorflow)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 目錄 一、導入數據并檢查 二、配置數據集 三、數據可視化 四、構建模型 五、訓練模型 六、模型對比評估 七、總結 一、導入數據并檢查 import pathlib,…

FFmpeg Muxer HLS

使用FFmpeg命令來研究它對HLS協議的支持程度是最好的方法&#xff1a; ffmpeg -h muxerhls Muxer HLS Muxer hls [Apple HTTP Live Streaming]:Common extensions: m3u8.Default video codec: h264.Default audio codec: aac.Default subtitle codec: webvtt. 這里面告訴我…

Apache和PHP:構建動態網站的黃金組合

在當今的互聯網世界&#xff0c;網站已經成為了企業、個人和機構展示自己、與用戶互動的重要平臺。而在這些動態網站的背后&#xff0c;Apache和PHP無疑是最受開發者青睞的技術組合之一。這一組合提供了高效、靈活且可擴展的解決方案&#xff0c;幫助您快速搭建出強大的網站&am…

git相關操作筆記

git相關操作筆記 1. git init git init 是一個 Git 命令&#xff0c;用于初始化一個新的 Git 倉庫。執行該命令后&#xff0c;Git 會在當前目錄創建一個 .git 子目錄&#xff0c;這是 Git 用來存儲所有版本控制信息的地方。 使用方法如下&#xff1a; &#xff08;1&#xff…