深刻理解引用、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'; // 錯誤 面向物件程式設計中,為了體