首页 > 后端开发 > C++ > 正文

为什么在 C 中使用基于范围的 For 循环和 std::vector 会导致错误?

Linda Hamilton
发布: 2024-10-27 07:45:31
原创
540 人浏览过

Why Does Using a Range-Based For Loop With std::vector<bool>导致 C 错误? 
在 C 中导致错误? " />

Range-for-Loops 和 std::vector

在 C 中,基于范围的 for 循环提供了一种迭代容器中元素的便捷方法。但是,当与布尔值容器一起使用时,某些行为可能看起来令人惊讶。

问题

考虑以下代码:

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

std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>
登录后复制

第一个循环成功迭代了 intVector 并但是,第二个循环会导致以下错误:

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}’
for (auto& i : boolVector)
登录后复制

原因

发生此错误是因为 std::vector 与其他标准容器不同。它将布尔值打包为整数(每个布尔值 32 位),而不是将其元素保存在单独的内存位置中。因此,它的迭代器返回一个代理对象,该代理对象通过位掩码提供对各个布尔值的访问。

解决方案

要迭代 std::vector,正确的语法是使用 auto&&,如果给定一个左值引用,它将绑定到左值引用,或者在这种情况下维护临时代理:

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>
登录后复制

通过使用 auto&&,如果给定 true 布尔值引用,编译器将正确折叠为左值引用,或者如果给定代理引用,则绑定并保持临时代理处于活动状态。

以上是为什么在 C 中使用基于范围的 For 循环和 std::vector 会导致错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板