亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是右值,左值,x值,glvalues和prvalues?

什么是右值,左值,x值,glvalues和prvalues?

浮云間 2019-05-27 16:09:28
什么是右值,左值,x值,glvalues和prvalues?在C ++ 03中,表達式是rvalue或lvalue。在C ++ 11中,表達式可以是:右值左值x值glvalueprvalue兩類已成為五大類。這些新的表達類別是什么?這些新類別如何與現有的左值和左值類別相關聯?C ++ 0x中的右值和左值類別是否與它們在C ++ 03中的相同?為什么需要這些新類別?是WG21神只是想迷惑我們凡人?
查看完整描述

3 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

這些新的表達類別是什么?

FCD(n3092)具有優異的描述:

- 左值(所謂的歷史,因為左值可能出現在賦值表達式的左側)指定一個函數或一個對象。[示例:如果E是指針類型的表達式,則* E是指向E指向的對象或函數的左值表達式。另一個例子,調用返回類型為左值引用的函數的結果是左值。 - 末端的例子]

- xvalue(“eXpiring”值)也指對象,通常接近其生命周期的末尾(例如,可以移動其資源)。xvalue是涉及rvalue引用的某些表達式的結果(8.3.2)。[示例:調用返回類型為右值引用的函數的結果是xvalue。 - 末端的例子]

- glvalue(“廣義”左值)是左值或x值。

- rvalue(歷史上所謂的,因為rvalues可能出現在賦值表達式的右側)是xvalue,臨時對象(12.2)或其子對象,或者是與對象無關的值。

- prvalue(“純”rvalue)是一個不是xvalue的rvalue。[示例:調用返回類型不是引用的函數的結果是prvalue。諸如12,7.3e5或true之類的文字的值也是prvalue。 - 末端的例子]

每個表達式都屬于此分類法中的基本分類之一:lvalue,xvalue或prvalue。表達式的此屬性稱為其值類別。[注意:第5章中對每個內置運算符的討論表明了它產生的值的類別以及它所期望的操作數的值類別。例如,內置賦值運算符期望左操作數是左值,右操作數是prvalue并產生左值作為結果。用戶定義的運算符是函數,它們期望和產生的值的類別由它們的參數和返回類型決定。 - 注意

我建議你閱讀3.10 Lvalues和rvalues的整個部分。

這些新類別如何與現有的左值和左值類別相關聯?

再次:


C ++ 0x中的右值和左值類別是否與它們在C ++ 03中的相同?

rvalues的語義特別隨著移動語義的引入而發展。

為什么需要這些新類別?

因此可以定義和支持移動構造/分配。


查看完整回答
反對 回復 2019-05-27
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

我將從你的上一個問題開始:


為什么需要這些新類別?


C ++標準包含許多處理表達式的值類別的規則。一些規則區分左值和右值。例如,當涉及到重載決策時。其他規則區分glvalue和prvalue。例如,您可以使用不完整或抽象類型的glvalue,但沒有不完整或抽象類型的prvalue。在我們使用這個術語之前,實際需要區分glvalue / prvalue的規則是指lvalue / rvalue和它們無意中是錯誤的還是包含了很多解釋和例外的規則......“除非rvalue是由于未命名右值參考......“。因此,將glvalues和prvalues的概念作為自己的名稱似乎是一個好主意。


這些新的表達類別是什么?這些新類別如何與現有的左值和左值類別相關聯?


我們仍然有與C ++ 98兼容的術語lvalue和rvalue。我們只是將rvalues分成兩個子組,xvalues和prvalues,我們將lvalues和xvalues稱為glvalues。Xvalues是未命名的右值引用的一種新值類別。每個表達式都是以下三個中的一個:左值,右值,右值。維恩圖看起來像這樣:


    ______ ______

   /      X      \

  /      / \      \

 |   l  | x |  pr  |

  \      \ /      /

   \______X______/

       gl    r

功能示例:


int   prvalue();

int&  lvalue();

int&& xvalue();

但也不要忘記命名的右值引用是左值:


void foo(int&& t) {

  // t is initialized with an rvalue expression

  // but is actually an lvalue expression itself

}


查看完整回答
反對 回復 2019-05-27
  • 3 回答
  • 0 關注
  • 1046 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號