首頁 >後端開發 >C++ >為什麼將基於範圍的循環與 std::vector 一起使用會導致編譯器錯誤?

為什麼將基於範圍的循環與 std::vector 一起使用會導致編譯器錯誤?

Patricia Arquette
Patricia Arquette原創
2024-10-26 06:05:31672瀏覽

Why Does Using Range-Based Loops with std::vector Result in a Compiler Error?

Range-for-Loops 和std::vector

在C 中,基於範圍的循環因其簡單性和可讀性而變得簡單和可讀性而變得簡單廣泛。它們迭代地迭代序列或容器物件的元素。

但是,當嘗試將基於範圍的循環與 std::vector 一起使用時,會出現奇怪的不一致情況。雖然以下程式碼將如預期運作:

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

將range-for-loops 與std::vector 結合使用;導致編譯器錯誤:

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

錯誤訊息「從'std::_Bit_iterator::reference 類型的右值初始化'std::_Bit_reference&'類型的非常量引用{aka std ::_Bit_reference}'" 表示正在使用右值初始化非常量參考。

理解問題

造成這種差異的原因在於不同的std::vector 的實作。與單獨儲存每個整數的 std::vector 不同,std::vector 儲存每個整數。採用位元打包來節省記憶體。因此,它的迭代器不會直接存取單一布林值,而是傳回對 std::_Bit_reference 的引用,該引用充當存取底層位的代理。

解決方案:使用 auto&&&

要解決這個問題,需要使用auto&&&而不是auto&。當提供左值時(例如第一個範例中的 intVector),此習慣用法將正確折疊對左值引用的引用,同時如果提供代理(如 boolVector 的情況),則同時綁定和維護臨時活動。

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

透過採用此技術,您可以有效地迭代 std::vector;並使用基於範圍的循環存取其元素。

以上是為什麼將基於範圍的循環與 std::vector 一起使用會導致編譯器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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