c++基礎·左值右值

一、左值與右值的本質特征

1. 基礎定義

  • 左值 (lvalue)
    ? 可出現在賦值運算符左側
    ? 可被取地址(有明確存儲位置)
    ? 通常為具名變量(如int a = 10;中的a

  • 右值 (rvalue)
    ? 不可出現在賦值左側
    ? 不可取地址(無持久存儲位置)
    ? 通常是臨時對象或字面量(如5,?a+1

2. 雙維度鑒別法

法一:賦值能力測試

int x = 10;    // x是左值  
x = 20;        // 合法  
// 10 = x;     // 錯誤:右值不可被賦值  

法二:地址操作驗證

int* p1 = &x;  // 成功  
// int* p2 = &(x+1); // 失敗:表達式結果無地址  

二、引用類型深度解析

1. 左值引用

規則:只能綁定左值

int a = 10;  
int& ref1 = a;     // ? 正確  
ref1 = 20;         // 修改原值  // int& ref2 = 5;  // ? 錯誤:無法綁定右值  
const int& cref = 5; // ? 特殊允許(編譯器創建臨時對象)  

2. 右值引用(完整保留你的代碼邏輯)

規則:綁定右值或通過std::move轉換

int&& rref1 = 10;            // ? 直接綁定字面量  
int b = 20;  
// int&& rref2 = b;         // ? 錯誤:b是左值  
int&& rref3 = std::move(b);  // ? 強制轉換(原對象進入"將亡"狀態)  

代碼陷阱示例

std::string s1 = "Hello";  
std::string&& s2 = std::move(s1);  
std::cout << s1; // 輸出結果不確定!可能為空或保留原值  

三、左值/右值引用應用場景

1. 左值引用典型用途

參數傳遞(避免拷貝)

void processBigData(const std::vector<int>& data) {  // 避免拷貝大型對象  
}  

操作容器元素

std::vector<int> vec{1,2,3};  
int& elem = vec[0]; // 直接修改元素  

2. 右值引用核心價值

實現移動語義(資源轉移)

class String {  char* data;  
public:  // 移動構造函數  String(String&& other) noexcept   : data(other.data)  {  other.data  = nullptr; // 原對象放棄資源  }  
};  

完美轉發(保留參數特性)

template<typename T>  
void relay(T&& arg) {  target(std::forward<T>(arg));  
}  

四、純右值詳解(完整保留你的分類)

1. 純右值 (prvalue) 類型

類別示例
字面量(除字符串外)42,?3.14,?'a'
算術/邏輯表達式結果a + b,?x && y
返回非引用的函數調用std::string("temp")
Lambda表達式[](){ return 5; }()

2. 典型場景代碼

int getValue() { return 100; }  int main() {  int c = getValue(); // 函數返回值是純右值  int d = c++;        // c++是純右值(返回舊值副本)  
}  

五、關鍵知識擴展

1. 移動語義性能對比

傳統拷貝?vs?移動操作

// 拷貝語義(高開銷)  
std::vector<int> v1(1000000, 5);  
std::vector<int> v2 = v1; // 深拷貝  // 移動語義(零拷貝)  
std::vector<int> v3 = std::move(v1); // 僅指針交換  

2.?std::move本質解析

  • 不做任何資源移動
  • 僅執行左值到右值的靜態類型轉換
  • 實際移動操作由對象的移動構造函數/賦值運算符實現

六、常見誤區與解答

??問題1:右值引用變量本身是左值還是右值?
? 解答:右值引用變量是左值!它有名字且可被取地址:

int&& rref = 10;  
int* p = &rref;  // 合法操作  

??問題2const左值引用為何能綁定右值?
? 解答:編譯器隱式創建臨時對象并綁定,生命周期延長至引用結束

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

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

相關文章

【Rust 精進之路之第9篇-所有權·核心】規則與移動 (Move):Rust 內存安全基石詳解

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025年4月20日 引言:沒有 GC,Rust 如何管好內存?答案是所有權! 在我們的 Rust 探索之旅中,我們已經學習了變量、數據類型、控制流、函數和強大的構建工具 Cargo。現在,我們將踏入 Rust 最…

嵌入式學習——opencv圖像庫編程

環境配置 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和圖像處理庫&#xff0c;廣泛用于各種計算機視覺任務&#xff0c;如圖像處理、視頻分析、人臉識別、物體檢測、機器學習等。它提供了豐富的函數和工具&#xff0c;用于處理…

一招破敵,掌控 React 渲染術:createRoot 與 root.render

前言 在這數字江湖中,前端門派百花齊放,React 一門尤為奇特,講究“以虛制實,以組件馭天下”。眼下你我初入江湖,第一關便是掛載組件之術。倘若不懂 createRoot 與 root.render,那就像一個新晉小俠,連起手式都沒學會,點穴還沒碰到 DOM,自己先內傷三分。 來吧,少年!…

Linux常見工具如yum、vim、gcc、gdb的基本使用,以及編譯過程和動靜態鏈接的區別

目錄 一、工具的本質 二、一些常用的工具 1.yum 2.vim 1&#xff09;vim的三種基本模式&#xff1a; 2&#xff09;vim的基本操作 ①命令模式下的基本操作&#xff1a; ②插入模式&#xff1a; ③底行模式&#xff1a; 3&#xff09;vim的配置&#xff1a;讓他變得更好用 3.gcc…

JavaScript 一維數組轉不含零的兩個數

問題描述&#xff1a; /*** param {number} n* return {number[]}*/ var getNoZeroIntegers function(n) {for(let i 1;i<n;i){if(String(i).indexOf(0) -1&&String(n-i).indexOf(0) -1){return [i,n-i]}}};String類型indexOf()函數如果找不到字串則返回-1&…

力扣DAY60-61 | 熱100 | 回溯:單詞搜索、分割回文串

前言 中等 √ 繼續回溯&#xff0c;不知咋地感覺這兩題有點難度&#xff0c;是因為隔一天就手感生疏了嗎&#xff1f; 單詞搜索 我的題解 定義方向數組、二維訪問數組。圖搜索&#xff0c;向上下左右每個方向搜索&#xff0c;需要更新的信息&#xff1a;坐標、是否遍歷過、…

超簡單的git學習教程

本博客僅用于記錄學習和使用 前提聲明全部內容全部來自下面廖雪峰網站&#xff0c;如果侵權聯系我刪除 0.前言 相信有不少人被推薦那個游戲學習git&#xff0c;一個不止我一個完全沒學習過的進去后一臉懵&#xff0c;半天都通不過一關然后就放棄了&#xff0c;我個人覺得那個…

【每日八股】復習 MySQL Day1:事務

文章目錄 復習 MySQL Day1&#xff1a;事務MySQL 事務的四大特性&#xff1f;并發事務會出現什么問題&#xff1f;MySQL 事務的隔離級別&#xff1f;不同事務隔離級別下會發生什么問題&#xff1f;MVCC 的實現原理&#xff1f;核心數據結構版本鏈構建示例可見性判斷算法MVCC 可…

在極狐GitLab 身份驗證中如何使用 OIDC?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 使用 OpenID Connect 作為認證提供者 (BASIC SELF) 您可以使用極狐GitLab 作為客戶端應用程序&#xff0c;與 OpenID Connec…

PHP騰訊云人臉核身生成 SDK 接口調用步驟使用簽名

參考騰訊云官方文檔&#xff1a; 人臉核身 生成 SDK 接口調用步驟使用簽名_騰訊云 前提條件&#xff1a;成功獲取NonceTicket。 獲取參考文檔&#xff1a; PHP騰訊云人臉核身獲取NONCE ticket-CSDN博客 function getTxFaceSign(){$appId ;$userId ;$version 1.0.0;$tic…

每日一題算法——鏈表相交

鏈表相交 力扣題目鏈接 暴力解法:飄過 class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode * cur headA;while(cur ! NULL){ListNode* curb headB;while(curb ! NULL){if(curbcur){return cur;}curb curb->next;}cu…

詳解Windows(一)——系統盤下目錄及文件詳解

引言 你是否曾經好奇過電腦里那些神秘的文件夾都是干什么用的&#xff1f;為什么有些文件是.exe而有些是.dll&#xff1f;不同的圖片格式.jpg和.png到底有什么區別&#xff1f;如果你對這些問題感到困惑&#xff0c;這篇文章就是為你準備的。今天&#xff0c;我們將以通俗易懂…

大模型賦能工業制造革新:10個顯效可落地的應用場景

在工業4.0的洶涌浪潮中&#xff0c;制造業正面臨著前所未有的轉型挑戰。傳統制造模式在效率、成本、質量等方面逐漸難以滿足市場需求&#xff0c;企業急需借助新技術實現數字化轉型&#xff0c;以提升自身競爭力。在此背景下&#xff0c;基于先進的數據分析技術、大模型、知識圖…

AI語音助手 React 組件使用js-audio-recorder實現,將獲取到的語音轉成base64發送給后端,后端接口返回文本內容

頁面效果&#xff1a; js代碼&#xff1a; import React, { useState, useRef, useEffect } from react; import { Layout, List, Input, Button, Avatar, Space, Typography, message } from antd; import { SendOutlined, UserOutlined, RobotOutlined, AudioOutlined, Stop…

pycharm無法識別到本地python的conda環境解決方法

問題一 現象描述&#xff1a; 本地已經安裝了conda&#xff0c;但在pycharm中選擇conda環境卻識別不到&#xff0c; 解決方法&#xff1a;手動輸入conda path&#xff0c;點擊R eload environments基本就能修復&#xff0c;比如我的路徑如下 /Users/test/conda/miniconda3/b…

PDK中technology file從tf格式轉換為lef格式

在數字后端流程中需要導入technology file工藝文件&#xff0c;一般傳統的PDK中都提供.tf形式&#xff0c;能夠在Synopsys ICC中進行導入。但是由于Cadence Innovus不斷地完善&#xff0c;更多的工程采用了其進行數字后端設計。不過Cadence Innovus導入的是.lef格式的工藝文件&…

UE虛幻4虛幻5動畫藍圖調試,觸發FellOutOfWorld事件和打印輸出,繼續DeepSeek輸出

找到了一個pdf&#xff0c;本來想寫個翻譯的&#xff0c;但還是算了&#xff0c;大概看了下&#xff0c;這類文檔很全面&#xff0c;內容很多&#xff0c;但都不是我要的&#xff0c;我想要一個動畫藍圖&#xff0c;搜索Montage&#xff0c;或者Anim 只占了一行&#xff08;幾百…

【Sa-Token】學習筆記05 - 踢人下線源碼解析

目錄 前言 強制注銷 踢人下線 源碼解析 前言 所謂踢人下線&#xff0c;核心操作就是找到指定 loginId 對應的 Token&#xff0c;并設置其失效。 上圖為踢人下線后&#xff0c;前端應該用圖像給出來讓用戶重新登錄&#xff0c;而不是讓前端收到一個描述著被下線 的JSON 強…

C語言==》字符串斷行

示例代碼 #include <stdio.h>int main(void) {printf("Heres one way to print a ");printf("long string.\n");printf("Heres another way to print a \ long string.\n");printf("Heres the newest way to print a ""lo…

Linux | I.MX6ULL 文件系統

01 本節所有的測試程序需要開發板有 Qt 環境來運行。我們提供的文件系統是由 yocto 裁剪整理得來的。之后我們會整理一份單獨移植的 qt 系統。方便用戶移植第三方軟件。如果用戶的文件系統非我們的出廠版本,請參考之前燒寫章節重新燒寫出廠文件系統。開發板啟動需要輸入登錄…