理解 Range-for-Loops 和 std::vector
在 C 中,基于范围的 for 循环简化了迭代容器。但是,当尝试将这些循环与某些容器类型(例如 std::vector
请考虑以下代码片段:
<code class="cpp">std::vector<int> intVector(10); for(auto& i : intVector) std::cout << i;
此代码迭代 intVector 集合并打印每个元素。但是,将 intVector 替换为 std::vector
<code class="cpp">std::vector<bool> boolVector(10); for(auto& i : boolVector) std::cout << i;
此修改后的代码会导致错误:
error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’
底层机制:
出现差异的原因是 std::矢量<布尔>操作方式与其他向量类型不同。在大多数 std::vector 变体中,迭代器指向元素类型的引用,允许通过 auto& 直接访问和修改。然而,对于 std::vector std::vector 解决方案: 要解决此问题,请在范围内使用 auto&&& -based 循环: auto&&& 语法检查迭代器引用的类型。如果是左值引用,则保持不变;否则,它会绑定并保留临时代理,从而使代码能够正确执行。 以上是为什么在 `std::vector` 上使用基于范围的 For 循环会导致错误?的详细内容。更多信息请关注PHP中文网其他相关文章!<code class="cpp">for(auto&& i : boolVector)
std::cout << i;</code>