乙個技術,首先了解要幹什麼,然後再了解怎麼幹;
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 語法做的優化,引用的本質還是靠指標...