C 11常用特性介紹 左值引用 右值引用

2022-08-29 02:36:12 字數 1280 閱讀 2458

一、左值、右值

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...