在 C 中导致错误? " />
在 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
要迭代 std::vector
<code class="cpp">for (auto&& i : boolVector) std::cout << i;</code>
通过使用 auto&&,如果给定 true 布尔值引用,编译器将正确折叠为左值引用,或者如果给定代理引用,则绑定并保持临时代理处于活动状态。
以上是为什么在 C 中使用基于范围的 For 循环和 std::vector