C++11 左值、右值、右值引用詳解

來源:互聯網
上載者:User

標籤:++   標準   div   初始化   value   避免   down   相關   之一   

C++11 左值、右值、右值引用詳解左值、右值

在C++11中所有的值必屬於左值、右值兩者之一,右值又可以細分為純右值、將亡值。 在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、沒有名字的就是右值(將亡值或純右值)。舉個例子,int a = b+c, a 就是左值,其有變數名為a,通過&a可以擷取該變數的地址;運算式b+c、函數int func()的傳回值是右值,在其被賦值給某一變數前,我們不能通過變數名找到它,&(b+c)這樣的操作則不會通過編譯。

右值、將亡值

在理解C++11的右值前,先看看C++98中右值的概念:C++98中右值是純右值,純右值指的是臨時變數值、不跟對象關聯的字面量值。臨時變數指的是非引用返回的函數傳回值、運算式等,例如函數int func()的傳回值,運算式a+b;不跟對象關聯的字面量值,例如true,2,”C”等。

C++11對C++98中的右值進行了擴充。在C++11中右值又分為純右值(prvalue,Pure Rvalue)和將亡值(xvalue,eXpiring Value)。其中純右值的概念等同於我們在C++98標準中右值的概念,指的是臨時變數和不跟對象關聯的字面量值;將亡值則是C++11新增的跟右值引用相關的運算式,這樣運算式通常是將要被移動的對象(移為他用),比如返回右值引用T&&的函數傳回值、std::move的傳回值,或者轉換為T&&的類型轉換函式的傳回值。

將亡值可以理解為通過“盜取”其他變數記憶體空間的方式擷取到的值。在確保其他變數不再被使用、或即將被銷毀時,通過“盜取”的方式可以避免記憶體空間的釋放和分配,能夠延長變數值的生命期。
左值引用、右值引用

左值引用就是對一個左值進行引用的類型。右值引用就是對一個右值進行引用的類型,事實上,由於右值通常不具有名字,我們也只能通過引用的方式找到它的存在。

右值引用和左值引用都是屬於參考型別。無論是聲明一個左值引用還是右值引用,都必須立即進行初始化。而其原因可以理解為是參考型別本身自己並不擁有所綁定對象的記憶體,只是該對象的一個別名。左值引用是具名變數值的別名,而右值引用則是不具名(匿名)變數的別名。

左值引用通常也不能綁定到右值,但常量左值引用是個“萬能”的參考型別。它可以接受非常量左值、常量左值、右值對其進行初始化。不過常量左值所引用的右值在它的“餘生”中只能是唯讀。相對地,非常量左值只能接受非常量左值對其進行初始化。

int &a = 2;       # 左值引用綁定到右值,編譯失敗int b = 2;        # 非常量左值const int &c = b; # 常量左值引用綁定到非常量左值,編譯通過const int d = 2;  # 常量左值const int &e = c; # 常量左值引用綁定到常量左值,編譯通過const int &b =2;  # 常量左值引用綁定到右值,編程通過

右值值引用通常不能綁定到任何的左值,要想綁定一個左值到右值引用,通常需要std::move()將左值強制轉換為右值,例如:

int a;int &&r1 = c;             # 編譯失敗int &&r2 = std::move(a);  # 編譯通過

C++11 左值、右值、右值引用詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.