回答
圍繞左值/右值條款存在一個常見的誤解。他們不是指變量,而是指表達式。一個表達式可以產生一個左值或右值,並且可以是常量或非常量。
特別是,在您的代碼中,定義int j = i;
右側的表達式i
是一個左值表達式,而不是右值。爲了賦值,有一個左值右值轉換,然後將其賦值給新聲明的變量。
連續性是一個正交的概念 - 在大多數情況下 - 與您是否可以或不可以改變正在處理的對象有關。
int f();
int& g();
const int& h();
const int k();
int main() {
f(); // non-const rvalue expression
g(); // non-const lvalue expression
h(); // const lvalue expression
k(); // const rvalue expression
f() = 5; // error, cannot assign to an rvalue
g() = 5; // correct, can modify a non-const lvalue
h() = 5; // error, cannot modify a constant lvalue
}
其他例子需要使用用戶定義類型:
struct test {
void foo() { x = 5; }
void bar() const;
int x;
};
test f();
const test g();
int main() {
f().foo(); // f() is a non-const rvalue,
// but you can call a method on the resulting object
g().foo(); // g() is a const rvalue,
// you cannot call a mutating member function
g().bar(); // but you can call a const member function
}
嗨,爲什麼我不能編譯第一個例子?謝謝。我試着評論錯誤陳述,但仍然沒有編譯。 – user12321 2011-03-03 00:55:45
@ user12321:你可能可以編譯而不是*鏈接*,因爲函數沒有被定義(錯誤是類似* undefined symbol ... *?的錯誤)。添加一個像'{static int x = 10; return x; }'給每個函數,註釋那些被標記爲錯誤的行,然後重試。 ('static'僅用於確保從返回引用的版本返回後該變量仍然存在) – 2011-03-03 08:36:56
在C++中,右值的內置類型不能是const或者非const。這只是沒有意義。但是,類類型可以是const和非const類型的。
右值只是VALUE(而不是對象/變量)。你對「非常量值」有什麼瞭解?
@Downvoter:我想知道我的回答中有什麼錯誤? – 2011-03-01 13:17:28
@Armen:我不是@downvoter,但是......你說「在C++中,內建類型的rvalues不能是const或非const。」右值**必須是常量或非常量。在OP示例中,我是右值並且是**非常量**。如果我被聲明爲'const int i = 5;'那麼當用作右值時,右值是** const **。 – qbert220 2011-03-01 13:34:41
@qbert:錯誤:) C++標準3.10.9狀態類的右值可以具有cv限定的類型;非類rvalues總是有cv不合格的類型。 Rvalues應始終具有完整的類型或void類型;除了這些類型之外,左值還可以具有不完整的 類型。 – 2011-03-01 13:42:32
- 1. 非等級rvalues總是有cv-不合格類型
- 2. rvalues的價值是什麼?
- 3. Rvalues vs temporaries
- 4. C++中的Rvalues 03
- 5. rvalues有什麼名字?
- 6. rvalues C++ 0x and moving to stack
- 7. 從變量而不是ob_get_content總結
- 8. javascript變量總是不相等
- 9. 變量總是復位
- 10. 變量總是返回false
- 11. 變量總是等於零
- 12. 總是整數變量
- 13. 是否有支持Rvalues的ref的指針版本?
- 14. 總是(節點js)不總是工作
- 15. rvalues在C++中存儲在哪裏?
- 16. 是否總是使用常量變量?
- 17. 總變量不會更新
- 18. TopMost不是TopMost總是 - WPF
- 19. Visual Studio 2015字符串文字不總是不變?
- 20. 試圖找出某個變量的總和不是總和使用sql
- 21. JS文本變量總是顯示undefined
- 22. SharedPreferences變量總是返回false
- 23. 實例變量總是返回零
- 24. 布爾變量總是返回false
- 25. 區域總是變成0結構
- 26. Laravel .ENV變量總是返回null
- 27. mod_rewrite的變量總是== '的index.php'
- 28. angularjs默認選擇總是變化
- 29. try_files總是返回404變量
- 30. Nagios NSCA第四變量總是$ OUTPUT $
「要求'const'」:如果它接受一個'const的A&',你也可以通過它的一些'A&'因爲從非const到const的轉換隱式發生。 – 2011-03-01 13:14:19
你應該添加「你的拷貝構造函數」的代碼,並解釋「你需要一個'const'」的含義。這將有助於回答您的實際疑問,而不是回答可能存在誤導的問題。 – 2011-03-01 14:16:17