左值引用,右值引用

2021-09-27 06:49:26 字數 1962 閱讀 8784

乙個技術,首先了解要幹什麼,然後再了解怎麼幹;

int  n = 10;

int & n_r = n;

n 是 左值; 

10 是右值;

n_r 是 n 的引用,就是左值引用;

右值:常量,函式返回的臨時變數(= 之前的的資料 ),都是右值;   //之前的文章,也簡介了 ,return 實現了什麼;

可以簡單認為 就是 int && n_rr; 簡單理解為,但不是這樣(作為函式引數,你可以暫時這麼理解,但是作為**宣告,其實還是左值);

std::move將 「資料」 轉為右值引用;

實際應用有什麼好處,簡單說:就是可以在類中多新增乙個 classname( classname &&)乙個建構函式;

可以在這個建構函式中實現 類(記憶體資料)的淺層 copy;記住,同時 「釋放」(不是真正的釋放,只是給了新的物件)了作為引數物件的記憶體資料。就是引數之後不可再用了,一般記憶體指標轉到新的物件中後,之前的物件記憶體指標賦值為null,當然這是預設的方法,當然,可以不賦值之前的記憶體指標為null,但是一般物件釋放的時候,會刪除指標指向的記憶體,這樣新的物件就不可用了;

下面給乙個示例,清晰明了的說明了左值引用右值引用std::move的應用示例;

// int show_1(int n)

//int show_1( int & n )

int show_1( int&& n )

int get_n( int n )

void main()

就是說,std::move 將引數強制轉換為 右值引用 "type &&";

看到這裡應該就可以簡單理解了;

和之前的std::move差不多,但是更強大一點;

1:引數方式不一樣,std::forward 通過顯示的函式模板引數;

2:可以通過模板型別制定是 「左值引用」 還是 「右值引用」

示例:int t(int &n) //函式1;

int t(int &&n) //函式2;

void main()

int n = 1;

int &m = n;

int && ln = std::move(n);

t(std::forward<int>(ln));

t(std::forward<int>(n));

t(std::forward<int>(m));

t(std::forward<int>(1));

//和之前的 std::move 一樣,轉為右值引用,執行函式2

t(std::

forward

<

int&>(

ln)); t

(std

::forward

<int&>(

n)); t

(std

::forward

<int&>(

m));

t(std::forward(1)); //注意:這個是錯誤的,編譯時會提示,這裡不可用用常量,參考std相關實現源**;

//     型別指定

int&,執行函式1;

左值 右值 左值引用 右值引用

2015 06 01 15 07 404人閱讀收藏 舉報 c 11 5 一 c 中的左值和右值 誤區 左值位於等號左邊,右值位於等號右邊。c 11中的定義 左值表示式表示的是乙個物件的身份 在記憶體中的位置 而右值表示式表示的是物件的值 內容 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...