中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

c++11左值引用和右值引用的用法

這篇文章主要講解了“c++11 左值引用和右值引用的用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“c++11 左值引用和右值引用的用法”吧!

為合陽等地區用戶提供了全套網頁設計制作服務,及合陽網站建設行業解決方案。主營業務為成都網站制作、做網站、外貿營銷網站建設、合陽網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

左值是表達式結束后依然存在的持久對象,既能出現在等號左邊也能出現在等號右邊的變量或表達式
右值是因為聲明結束后會被銷毀,所以不能放在等號左邊

#include <iostream>
using namespace std;


void Print(string& s){
    cout << s;
}


int main(){
    string s="abc";
    Print(s); // OK
    Print("abc"); // parse error
}

&是c++里的左值引用
&&是c11里的右值引用

  • 右值只能被const引用指向,在這時,右值的生命周期被延長了,直到引用銷毀。

  • 因為右值只能被const引用指向,所以我們才會在拷貝構造函數和賦值函數形參內加上const(還有一個原因是避免參數被修改),這里c11出現了一個特殊智能指針的non const拷貝構造函數

string Proc()
  {
       return string("abc");
  }
   
   int main()
  {
      const string& ref = Proc();
      //此時右值的生命周期延長了,直到main函數結束
      cout << ref << endl;
      return 0;
  }

使用std::move()接受一個參數,返回該參數對應的右值引用

template<typename _Tp>  
  inline typename std::remove_reference<_Tp>::type&&  move(_Tp&& __t)  
  { 
    return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); 
  }  
static_cast是一個強制類型轉換符,強制類型轉換會告訴編譯器:我們知道并且不會在意潛在的精度損失。
//下面有一個move使用的小例子
void swap(T& a, T& b)
 {
      T tmp = move(a);
      a = move(b);
      b = move(tmp);
      //可以看出相比較之前的進行了多次資源拷貝、銷毀的swap
      //在swap里使用move只是進行了三次的指針交換,效率提升
 }

forward()接收一個參數,返回該參數本來所對應的類型的引用。(即完美轉發)

#include <iostream>
//#include <utility> //for std::forward
using namespace std;

void print(const int& t)
{
    cout <<"lvalue" << endl;
}

void print(int&& t)
{
    cout <<"rvalue" << endl;
}

template<typename T>
void Test(T&& v) //v是Universal引用
{
    //不完美轉發
    print(v);  //v具有變量,本身是左值,調用print(int& t)
    
    //完美轉發
    print(std::forward<T>(v)); //按v被初始化時的類型轉發(左值或右值)
    
    //強制將v轉為右值
    print(std::move(v)); //將v強制轉為右值,調用print(int&& t)
}

int main()
{
    cout <<"========Test(1)========" << endl; 
    Test(1); //傳入右值
    
    int x = 1;
    cout <<"========Test(x)========" << endl;
    Test(x); //傳入左值
    
    cout <<"=====Test(std::forward<int>(1)===" << endl;
    Test(std::forward<int>(1)); //T為int,以右值方式轉發1
    //Test(std::forward<int&>(1)); //T為int&,需轉入左值
    
    cout <<"=====Test(std::forward<int>(x))===" << endl;
    Test(std::forward<int>(x)); //T為int,以右值方式轉發x
    cout <<"=====Test(std::forward<int&>(x))===" << endl;
    Test(std::forward<int&>(x)); //T為int,以左值方式轉發x
    
    return 0;
}
/*輸出結果
e:\Study\C++11\16>g++ -std=c++11 test2.cpp
e:\Study\C++11\16>a.exe
========Test(1)========
lvalue
rvalue
rvalue
========Test(x)========
lvalue
lvalue
rvalue
=====Test(std::forward<int>(1)===
lvalue
rvalue
rvalue
=====Test(std::forward<int>(x))===
lvalue
rvalue
rvalue
=====Test(std::forward<int&>(x))===
lvalue
lvalue
rvalue
*/

感謝各位的閱讀,以上就是“c++11 左值引用和右值引用的用法”的內容了,經過本文的學習后,相信大家對c++11 左值引用和右值引用的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!

網頁名稱:c++11左值引用和右值引用的用法
本文來源:http://m.2m8n56k.cn/article46/ggdgeg.html

成都網站建設公司_創新互聯,為您提供網站營銷小程序開發網站維護品牌網站建設服務器托管

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 欧美一区二区三区免费看 | 国产午夜人做人视频羞羞 | 成人高清毛片a | 亚洲影院国产 | 亚洲免费精品视频 | 一级特黄牲大片免费视频 | 中文久久| 日韩不卡一区二区三区 | 午夜寂寞福利 | 日韩精品一区二区三区在线观看 | 免费a视频在线观看 | 先锋影音xfyy5566男人资源 | 国产乱色在线观看 | 欧美日韩免费一区二区三区 | 69xxxx欧美老师 | 国产美女野外做爰 | 久久视精品 | 国产亚洲精品一区二区在线播放 | 国产美女一区二区三区 | 国产成人经典三级在线观看 | 欧美kkk4444在线观看 | 国产精品1区2区 | 91伊人久久 | 欧美精品高清在线观看 | 免费一级毛片无毒不卡 | 亚洲高清国产一区二区三区 | 欧美视频精品 | 日韩精品欧美国产精品亚 | 国产91精品久久久久久久 | 女人扒开腿让男人捅啪啪 | 国产真实乱子伦精品视 | 免费一级α片在线观看 | 亚洲欧美手机在线观看 | 美国毛片亚洲社区在线观看 | 中文字幕亚洲综合久久 | 一本一道久久综合狠狠老 | 国产亚洲欧美视频 | 国产精品资源 | 成人三级在线播放 | 久久亚洲国产 | 国产v精品成人免费视频400条 |