C++11 新增了另一種參照:右值參照(rvalue reference),這種參照可指向右值,是使用 &&
宣告的。使用右值參照可以減少複製操作,延長臨時物件生命週期,提升程式效能。它一般被用來實現移動語意和完美轉發,將 const
關鍵字用於右值參照的場景不多,這裡來總結一下 const
右值參照的特性,對其是否具有實際應用價值不做討論。右值參照必須在建立的同時進行初始化,且只能使用右值進行初始化,可將 const
關鍵字用於右值參照,如下所示:
//宣告並初始化常規右值參照變數
int && rrx = 55;
//將const關鍵字用於右值參照變數,以下幾種為等效表示
const int && crrx = 55;
int const && crrx = 55;
在 Microsoft Visual Studio 中連續多個 const
會被編譯器解釋成一個,即 const const const const int &&
與 const int &&
等效,除此之外,const int const &&
在 Microsoft Visual Studio 中也與 const int &&
等效,而 int && const
在 QT minGW 中將會報錯,在 Microsoft Visual Studio 中與 int &&
等效。
常規右值參照與 const
右值參照的特性如下:
int &&
的參照只能用來參照右值,不能用來參照左值,後面可修改其值。可將型別為 int
的非左值(比如字面常數 100
、多項表示式 1+50*2
、函數的 int
返回值)、型別不是 int
但可轉換為 int
的非左值(比如多項表示式 1.0+50.0*2.0
、字面常數 100.0
、函數的 double
返回值)在初始化時賦給 rrx
。變數初始化完成後,其地址就固定不變,其表現與 int
型別變數一致,右值參照變數自身屬於左值。const int &&
的參照也只能用來參照右值,不能用來參照左值,但後面不可修改其值。可將型別為 int
的非左值(比如字面常數 100
、多項表示式 1+50*2
、函數的 int
返回值)、型別不是 int
但可轉換為 int
的非左值(比如多項表示式 1.0+50.0*2.0
、字面常數 100.0
、函數的 double
返回值)在初始化時賦給 crrx
。變數初始化完成後,其地址就固定不變,其表現與 const int
型別變數一致,自身也屬於左值。常規右值參照變數的初始化用法如下:
//初始化方式一:字面常數
int && rrx = 100;
int && rrx = 100.0;
//初始化方式二:多項表示式
int && rrx = 1+50*2;
int && rrx = 1.0+50.0*2.0;
//初始化方式二:函數返回值
int && rrx = abs(10);
int && rrx = sqrt(10.0);
右值參照在部分情況下會生成臨時變數(一個典型例子是使用字面常數右值如 100
來初始化右值參照變數),然後將右值參照變數作為該臨時變數的別名,這與 const
左值參照十分相似,但與之不同的是:const
左值參照變數初始化完成後其值就無法被修改(許可權為唯讀),右值參照變數初始化完成後其值仍可修改(許可權為可讀可寫)。在另一些情況下,右值參照可以延長已有臨時變數的生命週期,減少複製操作的次數(一個典型例子是使用函數返回的類物件來初始化右值參照變數,在關閉編譯器優化的情況下可以將本需 2 次的複製操作減少為 1 次)。
被 const
關鍵字修飾的右值參照變數初始化用法如下,與常規右值參照變數的區別僅在於它們的可修改屬性不同。
//初始化方式一:字面常數
const int && crrx = 100;
const int && crrx = 100.0;
//初始化方式二:多項表示式
const int && crrx = 1+50*2;
const int && crrx = 1.0+50.0*2.0;
//初始化方式二:函數返回值
const int && crrx = abs(10);
const int && crrx = sqrt(10.0);
將初始化時 int &&
與 const int &&
可接受的形式列個表,如下,需要注意的是:可以將右值參照變數用於初始化左值參照變數,但不可將左值參照變數用於初始化右值參照變數,因為右值參照變數自身屬於左值。
初始化時可接受的形式 | int && 型別 |
const int && 型別 |
---|---|---|
int 變數 |
不可以 | 不可以 |
const int 變數 |
不可以 | 不可以 |
int & 變數 |
不可以 | 不可以 |
const int & 變數 |
不可以 | 不可以 |
int && 變數 |
不可以 | 不可以 |
const int && 變數 |
不可以 | 不可以 |
形如 100 的 int 字面常數 |
可以 | 可以 |
形如 1+50*2 的 int 多項表示式 |
可以 | 可以 |
返回型別為 int 的函數返回值 |
可以 | 可以 |
形如 100.0 可轉換為 int 的字面常數 |
可以 | 可以 |
形如 1.0+50.0*2.0 可轉換為 int 的多項表示式 |
可以 | 可以 |
本文作者:木三百川
本文連結:https://www.cnblogs.com/young520/p/16767851.html
版權宣告:本文系博主原創文章,著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請附上出處連結。遵循 署名-非商業性使用-相同方式共用 4.0 國際版 (CC BY-NC-SA 4.0) 版權協定。