for迴圈中右值引用解析

2021-10-03 06:35:34 字數 737 閱讀 7568

經常看到有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 語法做的優化,引用的本質還是靠指標...