首页 >后端开发 >C++ >为什么将基于范围的循环与 std::vector 一起使用会导致编译器错误?

为什么将基于范围的循环与 std::vector 一起使用会导致编译器错误?

Patricia Arquette
Patricia Arquette原创
2024-10-26 06:05:31671浏览

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