1. 程式人生 > >深刻理解引用、const引用、右值引用的本質

深刻理解引用、const引用、右值引用的本質

引用的本質是什麼?引用本質是變數的別名?其實這種說法有小問題

一,引用的本質

class A
{
    int &a;
};
class B
{
};
int main()
{

    using std::cout;
    using std::endl;

    cout << sizeof(A)<<sizeof(B);
    }

你會發現A的大小等於一個指標大小。
沒錯,引用底層是用const指標實現的,分配額外的記憶體空間
準確地說

int b=0;
int &a=b;

這種情況等同於

int b=0;
int *const
lambda=&b; //此後 *lambda就完全等價於上面的a

引用的特殊rebind

正常情況下,一般引用一旦繫結就不能rebind。
但是既然是指標那就有修改的方法

#include <iostream>
using namespace std;


int main()
{

    int i=5;
    int j=6;
    int &r=i;
    void *pi,*pj;
    int *addr;
    int dis;
    pi=&i;
    cout<<pi<<endl;//i的地址
    pj=&j;
    cout
<<pj<<endl;//j的地址 dis=(int)pj-(int)pi;//地址差 cout<<dis<<endl; addr=(int *)((int)pj+dis);//獲得引用底層const指標,即lambda的地址 (*addr)+=dis;//將r由指向i轉向指向j r=10; cout<<i<<" "<<j<<endl; }

輸出結果5 10
沒錯,r之前是繫結在i上,我們強行rebind到j上了

const引用

除了const本身帶來的區別外,const引用與普通引用稍有不同,體現在

const int &a = 1;//通過
    //int &a = 1;//非法

先在資料區開闢一個值為1的無名整型量,再將引用a與這個整型量進行繫結。

右值引用

&& 和左值引用的區別
1. 繫結的物件(引用的物件)不同,左值引用繫結的是返回左值引用的函式、賦值、下標、解引用、前置遞增遞減
2. 左值持久,右值短暫,右值只能繫結到臨時物件,所引用的物件將要銷燬或該物件沒有其他使用者
3. 使用右值引用的程式碼可以自由的接管所引用物件的內容

清單1

int &&i = 1;
int b = 2;
cout << i << endl;
i = b;
cout << i << endl;
//輸出1 2

清單1中i繫結到了右值1,說明:初始化時,右值引用一定要用一個右值表示式繫結;初始化之後,可以用左值表示式修改右值引用的所引用臨時物件的值.
int &&a=1;和const int &a=1;是完全一樣的操作,先在資料區開闢一個值為1的無名整型量,再將引用a與這個整型量進行繫結。但是右值引用直接支援rebind.
清單2

int&&temp =0;
int&&i = temp;//error!

清單2中temp是一個右值引用變數,變數是左值,因此i引用temp左值是非法的!

int a1 = 0, a2 = 1;
    int(&&c)[2] = { a1,a2 };
    c[0]++;
    std::cout << a1<<c[0];

在這裡{a1,a2}是傳值,因此a1仍等於0.
即使rebind到左值,也不會傳引用而僅僅是傳值

    int &&bb = 1;
    int cc = 0;
    bb = cc;
    bb++;
    cout << cc << bb<<endl;

相關推薦

深刻理解引用const引用引用本質

引用的本質是什麼?引用本質是變數的別名?其實這種說法有小問題 一,引用的本質 class A { int &a; }; class B { }; int main() { using std::cout; using s

C++引用—臨時變數引用引數和const引用和左引用

如果實參與引用引數不匹配,C++將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數:          實參型別是正確的,但不是左值          實參型別不正確,但可以轉換為正確的型別 Double refcube(const

[轉載][C++]C++11 左引用詳解

找到 延長 引用 () 字面量 別名 賦值 例子 左值 我之前以為左值就是等號左邊的值,右值就是等號右邊的值。 我 太天真 ?_? 原文地址:https://blog.csdn.net/hyman_yx/article/details/52044632 (侵刪 ------

C++11:引用移動語意與完美轉發

在C++11之前我們很少聽說左值、右值這個叫法,自從C++11支援了右值引用之後,大多數人會像我一樣疑惑:啥是右值? 準確的來說: 左值:擁有可辨識的記憶體地址的識別符號便是一個左值。 右值:非左值。 左值引用:左值識別符號的一個別名,簡稱引用

39.左引用引用

1、左值和右值的概念          左值是可以放在賦值號左邊可以被賦值的值;左值必須要在記憶體中有實體;          右值當在賦值號右邊取出值賦給其他變數的值;右值可以在記憶體也可以

引用移動語義

1.左值與右值 左值的幾種定義 a.可以取地址的,有名字的就是左值(但const常量不能做為左值) b.左值則是有名稱的,能夠被操作的物件 c.在記憶體中有獨立的記憶體空間,並且記憶體空間的內容是可變的,也就是通常所說的變數 右值的幾種定義 a.不能直接取地址,沒有名稱的,

引用引用

1、左值和右值的概念          左值是可以放在賦值號左邊可以被賦值的值;左值必須要在記憶體中有實體;          右值當在賦值號右邊取出值賦給其他變數的值;右值可以在記憶體也可以在C

C++11 左引用詳解(轉載)

左值、右值 在C++11中所有的值必屬於左值、右值兩者之一,右值又可以細分為純右值、將亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值(將亡值或純右值)。舉個例子,int a = b+c, a 就是左值,其有變數名為a,通過&a

C++11引用完美轉發foward可變模板引數例項

#include <iostream> using namespace std; struct A{ int x; A(int _x):x(_x){ co

引用 & C++11中

我們先來談談C++11中對左右值的判斷標準,以及左右值本身的一些細節,我想這應該是故事的開始。    在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值。    舉個例子:在a=b+c;中,&a是允許的操作,但&(b+c)這樣的操

C++11 左引用詳解

左值、右值 在C++11中所有的值必屬於左值、右值兩者之一,右值又可以細分為純右值、將亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值(將亡值或純右值)。舉個例子,int a = b+c, a 就是左值,其有變數名為a

引用引用(2)

表示式可以分為以下值類別之一: 左值Lvalue:如果表示式不是const限定的,則表示式可以出現在賦值表示式的左側。 x值:要過期的右值引用。 右值(Prvalue) rvalue:非xvalue表示式,僅出現在賦值表示式的右側。Rvalues包括xvalues和

引用"&"引用"&&"以及它們之間的轉換

C++11中的一個新特性就是右值引用和左右值之間的轉移語義。在此之前,C++中右值引用是不被允許的。增加右值引用和轉移語義這兩個特效能夠使程式碼更加簡潔高效。 新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新標準 (C++11,

引用引用

一、c++中的左值和右值 誤區:左值位於等號左邊,右值位於等號右邊。 C++11中的定義:左值表示式表示的是一個物件的身份(在記憶體中的位置),而右值表示式表示的是物件的值(內容)。 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫的:左值在表示式結束後仍然存在,右

C++ 左引用

看到這個type-id && cast-expression ,對於熟悉C語言的我有點發懵。 感覺就是C++的概念確實比C語言繁雜細膩的多,這個右值,就是非常的細膩區分變數的生存時間和記憶體的使用的概念,有必要理解清楚。 左值、右值 在C++11

14.C++11 新標準:foreach引用&&lambda表示式語言級別的執行緒與鎖

關鍵字和新語法 1、delete      指定刪除類的成員方法         在類的成員方法後面寫  = delete  就將該成員方法刪除,使用者無法呼叫。 智慧指標unique_ptr就是將物件的拷貝構造和operator=  delete刪除了 2、auto

c++11 中的引用 move forward

再次來寫左值右值相關的東西我的內心是十分惴惴不安的,一來這些相關的概念十分不好理解,二來網上相關的文章實在太多了,多少人一看這類題目便大搖其頭,三來也怕說不清反而誤導了別人,反覆糾纏這些似乎無關大雅的語言細節實在也有成為 language lawyer 之嫌。但我還是決定再總結一次,因為這是我一直以來學習新

引用引用指標RVO優化

這是我第一次真正意義上發技術部落格,對C++很多特性我瞭解的並不深,直到今天我才敢評論總結出來。 上面四個名詞,相信很多初學者會疑惑(我也不例外),什麼時候做什麼事?最開始,我的程式碼這麼寫: int max(int a, int b){ return a>b?a:

《深入理解C++11》筆記–引用:移動語義和完美轉發

上一篇:《深入理解C++11》筆記–建構函式 這篇文章介紹的了第三章中右值引用相關的內容。在介紹該內容之前,會對一些相關問題進行解釋,便於理解後面的內容。 並且,提前說明,許多編譯器會多拷貝構造和移動構造進行優化省略,這樣就看不到拷貝構造和移動構造的過程,需

c++ const 成員函式 & 臨時變數 & 引用 & move

const 成員函式 我們知道,在C++中,若一個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如: const char blank = 'a'; blank = 'b'; // 錯誤 面向物件程式設計中,為了體