首頁  >  文章  >  後端開發  >  為什麼我不能在 Range-for-Loop 中將 `auto&` 與 `std::vector` 一起使用?

為什麼我不能在 Range-for-Loop 中將 `auto&` 與 `std::vector` 一起使用?

Barbara Streisand
Barbara Streisand原創
2024-10-27 05:28:03546瀏覽

Why Can't I Use `auto&` with `std::vector` in a Range-for-Loop?

Range-for-Loops with std::vector

在C 中,range-for-loops 通常用於迭代透過STL 容器。但是,嘗試將這種方法與 std::vector 一起使用時可能會遇到錯誤。

考慮以下程式碼片段:

<code class="cpp">std::vector<int> intVector(10);
for(auto& i : intVector)
    std::cout << i;

此程式碼之所以有效,是因為 std: :向量是一個帶有對 int& 進行解引用的迭代器的容器。這意味著我們可以將迭代器的解引用值綁定到我們自己的左值引用 auto&。

但是,如果我們嘗試使用std::vector 執行相同的操作,我們將遇到錯誤類似於:

<code class="cpp">std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;</code>

這是因為std::vector不是傳統意義上的容器,而是位集。它以打包的方式儲存布林值,使用整數來表示多個布林值。因此,它的迭代器會傳回一個 Proxy 物件而不是 bool&。

代理程式是無法綁定到左值引用的臨時物件。這就是為什麼我們不能在上面的 range-for 循環中使用 auto& 的原因。相反,我們需要使用 auto&&,如果給定了一個左值引用,它將正確綁定到左值引用,或者如果給定了一個代理,它將保持臨時代理處於活動狀態。這是修正後的程式碼:

<code class="cpp">for(auto&& i : boolVector)
    std::cout << i;</code>

以上是為什麼我不能在 Range-for-Loop 中將 `auto&` 與 `std::vector` 一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn