[C++11] 右值引用

1.右值跟左值由什么區(qū)別

左值是指表達(dá)式結(jié)束后依然存在的持久對象,右值是指表達(dá)式結(jié)束時(shí)就不在存在的臨時(shí)對象。

2.什么是右值脸秽?

在C++11中骂删,右值由兩個(gè)概念構(gòu)成掌动,一個(gè)是將亡值四啰,另一個(gè)是純右值。
純右值:非引用返回的臨時(shí)變量粗恢、運(yùn)算表達(dá)式產(chǎn)生的臨時(shí)變量柑晒、原始字面量、lambda表達(dá)式等眷射。
將亡值:C++11新增的匙赞、與右值引用相關(guān)的表達(dá)式,比如凭迹,將要被移動的對象罚屋、T&&函數(shù)返回值、std::move返回值和轉(zhuǎn)換為T&&的類型的轉(zhuǎn)換函數(shù)的返回值嗅绸。

3.如何區(qū)分右值脾猛?

所有具名變量或?qū)ο蠖际亲笾担抑挡痪呙?br> 便捷方法:能不能對表達(dá)式取地址鱼鸠,如果能猛拴,則為左值,否則為右值蚀狰。

4.一些特性

  1. 無論聲明左值引用還是右值引用愉昆,都需要立即初始化,因?yàn)橐妙愋捅旧聿粨碛薪壎▽ο蟮膬?nèi)存麻蹋,只是該對象的別名跛溉。

  2. 常量左值引用也可以用來做性能優(yōu)化,因?yàn)槌A孔笾狄檬且粋€(gè)“萬能”的引用類型扮授,可以接收左值芳室、右值、常量左值和常量右值刹勃。需要注意的是非常量左值引用只能接收左值堪侯。

  3. T&& 不一定就是表示右值,它綁定的類型是未定的荔仁,既可能是左值也有可能是右值伍宦。

template<typename T>
void f(T&& param);
 
f(10);      //10是右值
int x = 10;
f(x);      //x是左值

如上例,param有時(shí)是左值乏梁,有時(shí)是右值次洼,這表示param實(shí)際上是一個(gè)未定的引用類型(universal reference)。它必須被初始化遇骑,
如果&&被一個(gè)左值初始化就是左值滓玖;如果&&被一個(gè)右值初始化就是右值。
需要注意的是质蕉,只有當(dāng)發(fā)生自動類型推斷時(shí)势篡,比如函數(shù)模板的類型自動推導(dǎo)翩肌,或auto關(guān)鍵字,&&才是一個(gè)universal reference禁悠。

template<typename T>
void f(T&& param);         //universal reference念祭,T的類型需要推導(dǎo)

class Test {
   ...
   Test(Test&& rhs);        //右值引用,已經(jīng)定義了一個(gè)特定的類型碍侦,沒有類型推斷
   ...
}

void f(std::vector<T>&& param)       //右值引用粱坤,在調(diào)用 f 前,T的類型已經(jīng)確定了

void f(const T&& param)            //右值引用瓷产,universal reference僅發(fā)生在T&&下站玄,任何一點(diǎn)的附加條件都會使之失效

5.引用折疊

由于存在T&&這種未定的引用類型,當(dāng)它作為參數(shù)時(shí)濒旦,有可能被一個(gè)左值引用或右值引用的參數(shù)初始化株旷,這種 經(jīng)過類型推導(dǎo)后的T&&類型,相比于右值引用(&&)會發(fā)生類型的變化尔邓,這種變化被稱為引用折疊晾剖。
引用折疊規(guī)則:
(1)所有的右值引用疊加到右值引用上仍然還是一個(gè)右值引用。
(2)所有的其他引用類型之間的疊加都將變成左值引用梯嗽。

左值和右值是獨(dú)立于它的類型的齿尽,右值引用有可能是左值也可能是右值,編譯器會將已命名的右值引用視為左值灯节,而將未命名的右值引用視為右值循头。

int&& var1 = 0;               //var1的類型是int&&,但是本身是一個(gè)左值
auto&& var2 = var1;           //根據(jù)引用折疊規(guī)則(2)炎疆,var2的類型是int&

下面在看一個(gè)例子:

int w1, w2;
auto&& v1 = w1;    //v1是universal reference, 被左值初始化卡骂,所以最終是一個(gè)左值
decltype(w1)&&  v2 = w2;   //報(bào)錯(cuò)!v2是一個(gè)右值引用類型磷雇,無法被左值初始化

如何將一個(gè)左值賦給一個(gè)右值引用類型呢?使用std::move, 可以將一個(gè)左值轉(zhuǎn)換為右值躏救。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唯笙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盒使,更是在濱河造成了極大的恐慌崩掘,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件少办,死亡現(xiàn)場離奇詭異苞慢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)英妓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門挽放,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绍赛,“玉大人,你說我怎么就攤上這事辑畦÷鸢觯” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵纯出,是天一觀的道長蚯妇。 經(jīng)常有香客問我,道長暂筝,這世上最難降的妖魔是什么箩言? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮焕襟,結(jié)果婚禮上陨收,老公的妹妹穿的比我還像新娘。我一直安慰自己胧洒,他們只是感情好畏吓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卫漫,像睡著了一般菲饼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列赎,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天宏悦,我揣著相機(jī)與錄音,去河邊找鬼包吝。 笑死饼煞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诗越。 我是一名探鬼主播砖瞧,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嚷狞!你這毒婦竟也來了块促?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤床未,失蹤者是張志新(化名)和其女友劉穎竭翠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薇搁,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斋扰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传货。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屎鳍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出损离,到底是詐尸還是另有隱情哥艇,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布僻澎,位于F島的核電站貌踏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窟勃。R本人自食惡果不足惜祖乳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秉氧。 院中可真熱鬧眷昆,春花似錦、人聲如沸汁咏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攘滩。三九已至帅刊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漂问,已是汗流浹背赖瞒。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚤假,地道東北人栏饮。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像磷仰,于是被迫代替她去往敵國和親袍嬉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本文根據(jù)眾多互聯(lián)網(wǎng)博客內(nèi)容整理后形成灶平,引用內(nèi)容的版權(quán)歸原始作者所有伺通,僅限于學(xué)習(xí)研究使用,不得用于任何商業(yè)用途民逼。 左...
    深紅的眼眸閱讀 11,267評論 1 12
  • C++11: rvalue 右值 rvalue & lvalue(右值與左值) 左值與右值的定義是比較復(fù)雜泵殴,下邊僅...
    fck_13閱讀 511評論 0 1
  • c++中引入了右值引用和移動語義,可以避免無謂的復(fù)制,提高程序性能疮鲫。有點(diǎn)難理解吆你,于是花時(shí)間整理一下自己的理解。 左...
    貳爺閱讀 291評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月俊犯,有人笑有人哭妇多,有人歡樂有人憂愁,有人驚喜有人失落燕侠,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,531評論 28 53
  • 人工智能是什么者祖?什么是人工智能?人工智能是未來發(fā)展的必然趨勢嗎绢彤?以后人工智能技術(shù)真的能達(dá)到電影里機(jī)器人的智能水平嗎...
    ZLLZ閱讀 3,768評論 0 5