一、左值、右值
1)左值:可以放在賦值號左側、可以被賦值的值;左值必須要在記憶體中有實體。
2)右值:必須放在賦值號右側、取出值賦值給其它變數;右值可以在記憶體中也可以在cpu暫存器中。
二、引用
引用是c++語法做優化,引用的本質還是靠指標來實現的,引用相當於變數的別名。
宣告引用的時候必須初始化,且一旦繫結,不能對引用重定義,對引用的一切操作,相當於對原物件的操作。
三、左值引用
c++11之前,沒有左值引用和右值引用之分,引用專指左值引用
左值引用的基本語法:type & 引用名 = 左值表示式,如:
int a = 1;
int &b = a;//a必須是左值,不能為右值
int &c = 1;//錯誤,1為右值
c++11前為了使引用接受左值又能接受右值,對const &新增了特殊技能,如:
cont int& c = 1;//正確
但是這種解決方式只能解決引數不變的情況,如果引數可變問題依然存在,為了解決這種問題,c++11引入了右值引用
四、右值引用
右值引用的基本語法:type && 引用名 = 右值表示式,如:
int && a = 1;//1為右值(&&中間不可以有空格)
五、萬能引用
如果乙個地方即有左值引用,又有右值引用,而且功能函式內容相同,這樣就要寫兩遍**,問題變得更麻煩了,如:
#include
void func(const i &){
std::cout << i << std::endl;
void func(int i&){
std::cout << i << std::endl;
void func(int &&i){
std::cout << i << std::endl;
int main()
int a = 1;
const int b = a;
func(b);//呼叫func(const int &i);
func(a);//呼叫func(int &i);
func(1);//呼叫func(int && i);
為了解決這個問題,在模板函式上新增了乙個完美**語法,這樣上面的幾個函式可以合成乙個函式, 如:
template
void func(t && t)
std::cout << t << std::endl;
注:這裡的&&已經不是右值引用了,而是被稱為萬能引用(universal references),而這種用法稱為完美**。
C 11 特性 左值 右值 右值引用 詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int func...
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...