[英]C++ lvalues and rvalues
好吧,所以我一直在學習左撇子和左撇子 - 有沒有精通C / C ++的人告訴我,我的想法是否正確?
考慮一下代碼:
int i = 3;
int j = i;
這里我們有兩個左值i
和j
,當i
被賦值給j
它變成一個隱式右值因為i
的副本存儲在j
。 但是,如果代碼看起來像:
int i = 3;
int j = &i;
j
和&i
都是左值,因為它們都是內存中的物理地址嗎? 我理解它的方式是rvalues是臨時數據,而lvalues有一個物理/可引用的內存地址。
對此的任何澄清都會很棒!
變量i
永遠不會成為左值。 如果你可以將address-of運算符應用於某些東西(就像你在第二個例子中所做的那樣),那么它就是一個左值。
此外,在第二實施例&i
是一個指向 i
,並具有類型int*
。 在j
的聲明和要初始化它的值之間存在類型不匹配。
最后,雖然i
本身是一個左值,但是表達式&i
不是左值,因為你不能將address-of運算符應用於它(即你不能做&&i
)。
作為左值或左 值是表達式的屬性。 通常,構成非const限定標識符的所有表達式都是可修改的左值 :
int i = 5;
i; // the expression "i" is an lvalue and is modifiable
const int j = 3;
j; // the expression "j" is still an lvalue, but not modifiable
可以通過任何賦值, ++
或--
運算符修改左值表達式(除非使用const
限定)。 您還可以在此類表達式上應用&
“address-of”運算符。
有些運算符比如一元*
,數組下標運算符[]
和.
和->
運算符也產生左值。 這意味着您可以說,例如, *p = 3
,或a[i] = 5
,或b.c++
或&c->d
。
另一方面,不是左值的表達式是右值(它們是臨時的並且不能被修改)。 如果您編寫類似3 = 5
或7++
,編譯器會抱怨3
和7
子表達式不是左值。
這里我們有兩個左手
i
和j
是的
當
i
被分配給j
它變成隱含的右值,因為i
的副本存儲在j
不是真的, i
仍然是左值,但它被轉換為右值來讀取它的值。 這稱為左值到右值的轉換。 j
仍然是左值。
j
和&i
都是左值,因為它們都是內存中的物理地址嗎?
j
是左值,但是&i
是右值; 特別是int*
類型的prvalue。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.