为什么这段代码有效
std::vectorintVector(10); for(auto& i : intVector) std::cout << i;
这不是吗?
std::vectorboolVector(10); for(auto& i : boolVector) std::cout << i;
在后一种情况下,我收到一个错误
错误:从'std :: _ Bit_iterator :: reference {aka std :: _ Bit_reference}'类型的右值开始,无效初始化'std :: _ Bit_reference&'类型的非const引用
for(auto& i : boolVector)
Quentin.. 28
因为std::vector
不是容器!
std::vector
迭代器通常取消引用a T&
,你可以绑定到你自己的auto&
.
std::vector
但是,bool
在整数内部将它们打包在一起,因此在访问它们时需要一个代理来执行位屏蔽.因此,它的迭代器返回一个Proxy
.
并且因为返回的Proxy
是prvalue(临时的),所以它不能绑定到左值引用,例如auto&
.
解决方案:use auto&&
,如果给定一个,将正确地折叠为左值引用,或者如果给定代理,则绑定并维护临时活动.
因为std::vector
不是容器!
std::vector
迭代器通常取消引用a T&
,你可以绑定到你自己的auto&
.
std::vector
但是,bool
在整数内部将它们打包在一起,因此在访问它们时需要一个代理来执行位屏蔽.因此,它的迭代器返回一个Proxy
.
并且因为返回的Proxy
是prvalue(临时的),所以它不能绑定到左值引用,例如auto&
.
解决方案:use auto&&
,如果给定一个,将正确地折叠为左值引用,或者如果给定代理,则绑定并维护临时活动.
std::vector
不遵守标准的容器规则.
特别是,它operator[]
不会返回bool&
.
无效代码中的循环
#include#include int main() { std::vector boolVector(10); for (auto& i: boolVector) std::cout << i; }
可以用三种方式重写,以迭代值:
(只读)
for (auto i: boolVector) std::cout << i;
(只读,可能效率低下)
for (auto const& i: boolVector) std::cout << i;
(读/写)
for (auto&& i: boolVector) std::cout << i;
第一个和最后一个之间的选择取决于您是需要修改向量中的值,还是只是为了读取它们.
vector
(通常)专门用于将每个存储bool
在一个位中,从而将存储成本从每个值一个字节减少到每八个值一个字节.没有我知道的处理器是位可寻址的,所以不可能存储对值中的值的引用vector
.您需要使用plain auto
,而不是auto&
迭代值i
.