經常看到有for(auto &&p : range)
的寫法,但是不知道為什麼這裡要用右值引用,今天深究了一下。
vector< bool>的記憶體空間為節約儲存,是按bit儲存的,而不是byte,所以當vector< bool> c; auto p = c[0]
時p的型別是乙個std::vector< bool>:reference
物件,這不是乙個左值。這也是為什麼下列操作會編譯出錯的原因
vectorc;
bool &tmp = c[0]; //錯誤,不能編譯,對於引用來說,因為c[0]不是乙個左值
bool *p = &c[0]; //錯誤,不能編譯,因為無法將乙個臨時量位址給繫結到指標
另外
auto p = c[0];// 當改變p時,c[0]也將發生改變。這是因為std::vector< bool>:reference物件具有引用的特性
基於此
vector< bool> c;
for(auto &i : c)會報錯。
但是右值引用可以繫結到std::vector< bool>:reference物件上
因此更有效,並且正確,並且具有普適性的版本出來了。
vector< bool> c;
for(auto &&i : c)
左值 右值 左值引用 右值引用
2015 06 01 15 07 404人閱讀收藏 舉報 c 11 5 一 c 中的左值和右值 誤區 左值位於等號左邊,右值位於等號右邊。c 11中的定義 左值表示式表示的是乙個物件的身份 在記憶體中的位置 而右值表示式表示的是物件的值 內容 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫...
左值 左值引用 右值 右值引用
1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...
左值 左值引用 右值 右值引用
1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...