首頁  >  文章  >  後端開發  >  為什麼在 `std::vector` 上使用基於範圍的 For 迴圈會導致錯誤?

為什麼在 `std::vector` 上使用基於範圍的 For 迴圈會導致錯誤?

Patricia Arquette
Patricia Arquette原創
2024-10-26 03:57:02823瀏覽

Why Does Using a Range-Based For Loop on `std::vector` Cause an Error?

理解Range-for-Loops 和std::vector

在C 中,基於範圍的for 循環簡化了迭代容器。但是,當嘗試將這些循環與某些容器類型(例如 std::vector)一起使用時,可能會出現意外行為。

請考慮以下程式碼片段:

此程式碼迭代 intVector 集合並列印每個元素。但是,將 intVector 替換為 std::vector 。 boolVector:

此修改後的程式碼會導致錯誤:

底層機制:

出現差異的原因是std ::向量操作方式與其他向量類型不同。在大多數 std::vector 變體中,迭代器指向元素類型的引用,允許透過 auto& 直接存取和修改。然而,對於 std::vector 來說情況並非如此。

std::vector透過將布林值打包成整數來有效地儲存布林值。因此,迭代器傳回一個特殊的代理對象,該對象執行位元操作來檢索布林值。該代理程式是一個右值(臨時),不能綁定到左值引用(auto&)。

解決方案:

要解決此問題,請在範圍內使用auto&&& -based 循環:

auto&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&案 請引用的型別。如果是左值引用,則保持不變;否則,它會綁定並保留臨時代理,從而使程式碼能夠正確執行。

以上是為什麼在 `std::vector` 上使用基於範圍的 For 迴圈會導致錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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