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的語義特別隨著移動語義的引入而發展。
為什么需要這些新類別?
因此可以定義和支持移動構造/分配。

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
}
- 3 回答
- 0 關注
- 1046 瀏覽
添加回答
舉報