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

C++左值與右值核心判斷方法

 更新時間:2026年06月04日 09:06:22   作者:代碼中介商  
C++ 11 引入右值引用和移動語義后,左值右值的區(qū)分變得更加重要,本文介紹C++左值與右值核心判斷方法,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧

引言

在 C++ 學(xué)習(xí)中,"左值"和"右值"是繞不開的核心概念。它們是理解引用、移動語義、完美轉(zhuǎn)發(fā)的基礎(chǔ)。很多 C++ 程序員寫了多年代碼,仍然對"為什么這里能綁、那里不能綁"感到困惑——根本原因就是沒搞懂左值右值的判斷規(guī)則。

C++ 11 引入右值引用和移動語義后,左值右值的區(qū)分變得更加重要。本文作為系列第一篇,將聚焦最基礎(chǔ)的問題:什么是左值?什么是右值?如何判斷?

第一部分:表達式的兩個屬性

C++ 中每個表達式都有兩個獨立屬性:

第二部分:左值 (lvalue)

一、定義

左值 = 有身份、可尋址的表達式。通俗說就是能取地址的、有名字的東西。

二、判斷法則

核心法則:能用 & 取地址的表達式就是左值。

int main() {
    int x = 10;        // x 是左值
    int* p = &x;       // ? 可以對 x 取地址
    int y = 20;
    int* p2 = &(x + y);  // ? 錯誤!x+y 是臨時結(jié)果,不能取地址
    return 0;
}

三、哪些是左值

類別示例說明
變量名x、name、vec最常見
解引用指針*p指針指向的對象
數(shù)組元素arr[3]數(shù)組元素有確定位置
成員變量obj.member對象成員有地址
返回左值引用的函數(shù)vec.front()返回的是引用
賦值表達式(a = b)賦值返回左值
字符串字面量"hello"唯一能取地址的字面量(C 語言遺留)
int x = 10;           // x 是左值
int* p = &x;          // *p 是左值(可以 &(*p))
int arr[5] = {1,2,3}; // arr[2] 是左值
string s = "hello";
s[0];                 // 左值,返回 char&
int a = 1, b = 2;
(a = b) = 3;          // 合法!賦值表達式返回左值

第三部分:右值 (rvalue)

一、定義

右值 = 臨時對象、字面量、不能取地址的表達式。右值又細分為純右值將亡值。

二、純右值 (prvalue)

純右值 = 純粹的臨時值,沒有地址,馬上就要消失

42;                   // 純右值:整數(shù)字面量
3.14;                 // 純右值:浮點字面量
true;                 // 純右值:布爾字面量
a + b;                // 純右值:運算產(chǎn)生的臨時結(jié)果
&a;                   // 純右值:取地址產(chǎn)生的臨時指針
[](int x){return x;}; // 純右值:Lambda 表達式

三、將亡值 (xvalue)

將亡值 = 即將被移動、資源將要被轉(zhuǎn)移的表達式。C++11 新增,主要用于移動語義。

#include <utility>
int x = 10;
std::move(x);          // 將亡值:把 x 轉(zhuǎn)成右值
string getString() {
    return "hello";
}
getString();           // 純右值(C++17 前)/ 將亡值(特殊情況)

四、哪些是右值

類別示例說明
數(shù)字字面量423.14不能取地址
布爾字面量true、false不能取地址
算術(shù)結(jié)果a + b、x * y臨時結(jié)果
取地址結(jié)果&a臨時指針
Lambda[]{}匿名函數(shù)對象
std::move(x)std::move(x)強制轉(zhuǎn)右值
返回非引用的函數(shù)getValue()臨時對象

第四部分:核心判斷法則

最簡單的記憶方式

判斷結(jié)果
有名字的變量左值
能放到賦值號左邊左值
不能取地址的臨時東西右值
std::move(x) 的結(jié)果右值(將亡值)

第五部分:特殊情況的判斷

一、字符串字面量

"hello";   // 左值!C 語言遺留,字符串字面量是 const char[6]
&"hello";  // ? 可以取地址!
42;        // 右值,普通數(shù)字字面量
&42;       // ? 錯誤!不能取地址

字符串字面量是唯一的左值字面量。

二、賦值表達式

int a, b;
(a = b) = 3;     // 合法!賦值表達式返回左值
a = b = c = 0;    // 鏈式賦值,就是因為賦值返回左值
// C++ 中 =
// 1. 把右邊的值賦給左邊
// 2. 整個表達式返回左邊的引用(左值)

三、前置自增 vs 后置自增

int x = 10;
++x;       // 返回 x 的引用 → 左值
x++;       // 返回 x 的舊值(臨時)→ 右值
++++x;     // ? 合法(++x 是左值,可以再 ++)
x++++;     // ? 錯誤(x++ 是右值,不能再 ++)

四、條件表達式

int a = 1, b = 2;
(a > b ? a : b) = 3;  // ? 兩個都是左值 → 結(jié)果是左值
int x = 1;
(x > 0 ? x : 0) = 3;  // ? 一個左值一個右值 → 結(jié)果是右值

五、成員訪問

struct Point { int x, y; };
Point p = {1, 2};
p.x;              // 左值(p 是左值)
Point{3, 4}.x;    // C++11 后可以是左值(臨時對象的成員)

第六部分:左值引用

一、基本規(guī)則

左值引用 T& 只能綁定到左值。

int x = 10;
int& ref1 = x;         // ? x 是左值
int& ref2 = 42;        // ? 42 是右值
int& ref3 = x + 1;     // ? x+1 是右值
int* p = &x;
int& ref4 = *p;        // ? *p 是左值

二、const 左值引用(萬能引用)

const T& 既可以綁定左值,也可以綁定右值。這是 C++ 早期為了效率(避免拷貝)引入的特例。

const int& ref1 = 10;     // ? 合法!綁定右值,生命周期延長
const int& ref2 = x + 1;  // ? 合法!
int x = 10;
const int& ref3 = x;      // ? 也可以綁定左值

const T& 為什么能綁定右值? 編譯器會在幕后創(chuàng)建一個臨時變量,把右值存進去,然后讓引用指向它。這個臨時變量的生命周期會延長到引用的生命周期。

// 編譯器大概這樣處理:
const int& ref = 42;
// ↓ 等價于
// const int __temp = 42;
// const int& ref = __temp;

第七部分:類型與值類別的獨立性

一個容易混淆的點:類型和值類別是獨立的。

int&& rref = 10;  // rref 的類型是 int&&(右值引用類型)
                  // 但 rref 本身是一個有名字的變量
                  // 所以 rref 是左值!
int x = 10;
int&& rref2 = std::move(x);  // rref2 的類型是 int&&
                               // 但 rref2 是左值

核心原則:有名字的就是左值,不管它是什么類型。int&& 類型的變量本身也是左值。

void foo(int& x)  { cout << "左值引用" << endl; }
void foo(int&& x) { cout << "右值引用" << endl; }
int main() {
    int&& rref = 10;  // rref 是左值!
    foo(rref);        // 調(diào)用 foo(int&) — 輸出"左值引用"
    foo(std::move(rref));  // 調(diào)用 foo(int&&) — 輸出"右值引用"
}

總結(jié)

一、核心判斷法則

二、引用綁定規(guī)則

引用類型可以綁定
T&只能左值
const T&左值 + 右值(萬能)
T&&只能右值

三、一句話記憶

左值是有身份、可尋址、持久存在的表達式(有名字的變量、解引用指針),右值是臨時對象和字面量(不能取地址)。const T& 是萬能引用能綁一切,T& 只能綁左值,T&& 只能綁右值。有名字的 int&& 變量本身是左值。

到此這篇關(guān)于C++左值與右值:核心判斷法則詳解的文章就介紹到這了,更多相關(guān)C++左值與右值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VS?Code?C++環(huán)境的搭建過程

    VS?Code?C++環(huán)境的搭建過程

    這篇文章主要介紹了VS?Code?C++環(huán)境的搭建,Somasegar 也告訴筆者這款編輯器也擁有對 Git 的開箱即用的支持,需要的朋友可以參考下
    2022-04-04
  • C++11中模板隱式實例化與顯式實例化的定義詳解分析

    C++11中模板隱式實例化與顯式實例化的定義詳解分析

    實例化是為在程序中的函數(shù)模板本身并不會生成函數(shù)定義,它只是一個用于生成函數(shù)定義的方案。編譯器使用模板為特定類型生成函數(shù)定義時,得到的是模板實例。這即是函數(shù)模板的實例化。而函數(shù)模板實例化又分為兩種類型:隱式實例化和顯式實例化
    2022-04-04
  • C++ STL中的常用遍歷算法分享

    C++ STL中的常用遍歷算法分享

    這篇文章主要為大家詳細介紹了C++ STL中兩個常用的遍歷算法,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)與借鑒價值,感興趣的小伙伴可以參考一下
    2022-12-12
  • C++結(jié)構(gòu)體與類指針知識點總結(jié)

    C++結(jié)構(gòu)體與類指針知識點總結(jié)

    在本篇文章里小編給大家整理了關(guān)于C++結(jié)構(gòu)體與類指針知識點以及相關(guān)內(nèi)容,有興趣的朋友們參考學(xué)習(xí)下。
    2019-09-09
  • C語言中的多行輸入問題及說明

    C語言中的多行輸入問題及說明

    這篇文章主要介紹了C語言中的多行輸入問題及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言實現(xiàn)飛機游戲(2)

    C語言實現(xiàn)飛機游戲(2)

    這篇文章主要介紹了C語言實現(xiàn)飛機游戲的第二部分,進行功能完善,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言實現(xiàn)外賣管理系統(tǒng)

    C語言實現(xiàn)外賣管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)外賣管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++使用tinyxml庫處理XML文件

    C++使用tinyxml庫處理XML文件

    TinyXML是一個開源的解析XML的解析庫,能夠用于C++,能夠在Windows或Linux中編譯,這個解析庫的模型通過解析XML文件,然后在內(nèi)存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹,本文為大家介紹的是使用tinyxml庫處理XML文件,需要的可以參考一下
    2023-07-07
  • 使用Objective-C獲取IPHONE手機IMSI序列號

    使用Objective-C獲取IPHONE手機IMSI序列號

    這篇文章主要介紹了使用Objective-C獲取IPHONE手機IMSI序列號的方法以及通過IMSI序列號獲取運營商、手機號的方法,非常的實用,有需要的小伙伴可以參考下。
    2015-04-04
  • 詳細總結(jié)C++的排序算法

    詳細總結(jié)C++的排序算法

    趁空閑時間,小編決定把C++的排序算法分析并總結(jié)下,以便溫故知新。也方便需要的朋友可以參考學(xué)習(xí)。
    2016-07-07

最新評論

北票市| 澄城县| 社会| 区。| 读书| 阳江市| 丁青县| 化德县| 柘城县| 通渭县| 台北县| 安康市| 互助| 道真| 乌拉特前旗| 彰化市| 横峰县| 鹰潭市| 尚志市| 乌鲁木齐县| 库车县| 邓州市| 靖安县| 崇礼县| 饶阳县| 宝坻区| 堆龙德庆县| 宁津县| 慈利县| 彝良县| 商水县| 博白县| 平山县| 兰溪市| 渑池县| 莫力| 景德镇市| 孝感市| 新乡市| 英吉沙县| 临汾市|