引用摺疊和右值引用引數
通常我們不能將一個右值引用繫結到一個左值上。但是,C++語言在正常的繫結規則之外定義了兩個例外規則:
第一個例外規則影響右值引用引數的推斷如何進行。當我們將一個左值傳遞給函式的右值引用引數,且此右值引用指向模板型別引數(如T&&)時,編譯器推斷模板型別引數為實參的左值引用型別。
第二個例外繫結規則:如果我們間接建立一個引用的引用,則這些引用形成了“摺疊”。在所有情況下(除了一個例外),引用會摺疊成一個普通的左值型別。在新標準中,摺疊規則擴充套件到右值引用。只在一種特殊情況下引用會摺疊成右值引用:右值引用的右值引用。即對於一個給定型別X:
1。X& &、X& &&和X&& &都摺疊成型別X&。
2。型別X&& &&摺疊成X&&。
這兩個規則導致了兩個重要結果:
1。如果一個函式引數是一個指向模板型別引數的右值引用(如T&&),則它可以被繫結到一個左值;且
2。如果實參是一個左值,則推斷出的模板實參型別將是一個左值引用,且函式引數將被例項化為一個(普通)左值引用引數(T&)。
另外值得注意的是,這兩個規則暗示我們:可以將任意型別的實參傳遞給T&&型別的函式引數。
在實際中,右值引用通常用於兩種情況:模板轉發其實參或模板被過載。
相關推薦
引用摺疊和右值引用引數
通常我們不能將一個右值引用繫結到一個左值上。但是,C++語言在正常的繫結規則之外定義了兩個例外規則: 第一個例外規則影響右值引用引數的推斷如何進行。當我們將一個左值傳遞給函式的右值引用引數,且此右值引用指向模板型別引數(如T&&)時,編譯器推斷
C++ 引用& 和 右值引用&& (1)
我們先來簡單介紹下&引用: C和C++使用&符號來只是變數的地址。C++給&符號賦予了另一個含義,將其來宣告引用。 例如,要將rodents作為rats變數的別名,可以這樣做: int rats; int & rodents = rates;
左值引用和右值引用
開發 左值 優化 語法 表達 3.2 右值 實現 規則 1、左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值;左值必須要在內存中有實體; 右值當在賦值號右邊取出值賦給其他變量的值;右值可以在內存也可以在CPU寄存器。
C++左值引用和右值引用
分配內存 右值 markdown type 提高 指向 區分 基本語法 down 1.左值和右值概念: 左值是可以放在賦值號左邊可以被賦值的值:左值就是指在表達式使用完之後仍存在的對象(存儲空間); 右值當在賦值號右邊去除值賦給其他變量的值:右值可以在內存也可以在CPU寄存
移動語義和右值引用
右值引用: c++的傳統引用(現在成為左值引用)使得時標符關聯到左值。左值是一個表示資料的表示式(如變數名或解除引用的指標),程式可以獲取其地址。 C++11新增了右值引用,用&&表示。右值引用可以關聯到右值,即可出現在賦值表示式的右邊,但不能對其應用地址運算子的值。右值包括
C++ 引用& 和 右值引用&& (1)
我們先來簡單介紹下&引用: C和C++使用&符號來只是變數的地址。C++給&符號賦予了另一個含義,將其來宣告引用。 例如,要將rodents作為rats變數的別名,可以這樣做: int rats; int & rodents = rat
返回值和右值引用的傳遞問題
最近突然發現了這個問題,挺有意思的,記錄下來備忘。 以下程式碼在gcc 4.8.1下編譯測試。 測試類 測試類結構如下: class Test2 { public: Test2() {} Test2(const char* str); Test2(co
C++11中的universal引用和右值引用
stackoverflow上有個問題:Why “universal references” have the same syntax as rvalue references? 就是說為什麼這倆的形式都是T&&(T表示一個型別)。其中有一個回答很
C++11新特性:移動語義和右值引用
右值引用 傳統的C++引用(左值引用)使得識別符號關聯到左值。左值是一個表示資料的表示式(如變數名或解除引用的指標),程式可以獲得其地址。 C++11新增了右值引用。右值引用,顧名思義,可以關聯到右值,即——可以出現在賦值表示式的右邊,但不能對其應用地址運算
C++——左值引用和右值引用
這篇blog主要介紹一下左值和右值的概念及應用陷阱 1、左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值;左值必須要在記憶體中有實體; 右值當在賦值號
04區分通用引用和右值引用 Scott Meyers的effective modern c++講座摘要
.com all temp 對象 變量 圖片 做了 oca png 大師就是大師,可愛的蘑菇頭,講的太好了,很精彩!有激情,有耐心,很難解釋的東西隨手舉幾個例子就明白了!強烈推薦看看視頻! https://www.youtube.com/playlist?list=PLmx
c++11-17 模板核心知識(十)—— 區分萬能引用(universal references)和右值引用
- [引子](#引子) - [如何區分](#如何區分) - [模板引數](#模板引數) - [const disqualify universal reference](#const-disqualify-universal-reference) - [auto宣告](#auto宣告) ##
C++引用—臨時變數、引用引數和const引用和左值右值引用
如果實參與引用引數不匹配,C++將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數: 實參型別是正確的,但不是左值 實參型別不正確,但可以轉換為正確的型別 Double refcube(const
第15課 右值引用(2)_std::move和移動語義
可見 div 強制轉換 let 技術分享 移動語義 ptr align 講解 1. std::move (1)std::move的原型 template<typename T> typename remove_reference<T>::type&
關於java的引數傳遞(值傳遞、引用傳遞和傳值、傳引用等)
所謂引數傳遞就是用函式呼叫所給出的實參(實際引數)向函式定義所給出的形參(形式引數)設定初始值的過程。基本的有三種引數分別為: (1)傳值: (2)傳址(即是傳指標) (3)傳引用 以上
C++11右值引用、完美轉發foward、可變模板引數例項
#include <iostream> using namespace std; struct A{ int x; A(int _x):x(_x){ co
C++11 新特性之右值引用和轉移建構函式
問題背景 #include <iostream> usingnamespace std; vector<int> doubleValues (const vector<int>& v) {
C++的雜七雜八:我家的返回值才不可能這麼傲嬌(右值引用和移動語義)
大凡程式語言,都會有“函式”這個概念。而對於外部而言,一個函式最重要的部分就是它的返回值了。 說這裡,返回值其實應該是一個很簡單的話題。當需要通過函式傳遞一個值出去的時候,使用返回值不是理所當然的嘛,比如說,像下面這樣: int add(int a, int b)
《深入理解C++11》筆記–右值引用:移動語義和完美轉發
上一篇:《深入理解C++11》筆記–建構函式 這篇文章介紹的了第三章中右值引用相關的內容。在介紹該內容之前,會對一些相關問題進行解釋,便於理解後面的內容。 並且,提前說明,許多編譯器會多拷貝構造和移動構造進行優化省略,這樣就看不到拷貝構造和移動構造的過程,需
左值和右值、左值引用與右值引用(2)
表示式可以分為以下值類別之一: 左值Lvalue:如果表示式不是const限定的,則表示式可以出現在賦值表示式的左側。 x值:要過期的右值引用。 右值(Prvalue) rvalue:非xvalue表示式,僅出現在賦值表示式的右側。Rvalues包括xvalues和