我刚测试了这段代码。
vector<bool> v(5, true);
if(v.back())cout<<"====="<<endl;
auto b1 = v.back();
b1 = false;
cout<<&b1<<endl;
if(v.back())cout<<"*********"<<endl;
我的问题如下:
auto
正在更改布尔矢量v
? vector<bool>
不是标准的STL容器,并且&v[4]
解决它的元素将无效(因为你无法解决一点地址),如果{{ 1}}是由对b1
的引用声明的,为什么我可以通过v.back()
解决b1
?&b1
在什么情况下有这种行为? auto
以及之后的auto c1 = v.begin()
会更改c1 = (++v.begin())
吗?答案 0 :(得分:11)
vector<bool>
标准库失败,vector<T>
不是T
s 的容器。
因此,它与vector
的所有其他实例化具有明显不同的行为。
您偶然发现的特定疣是它的成员类型reference
是代理类,表示对单个bool
的引用。
这意味着auto
,从不推断作为参考,推断为该代理类,将表现为,就好像它是一个参考。 / p>
&v[4]
无法在索引4处获取指向bool
的指针,因为vector<bool>
不是bool
的容器,而index-operator也返回那些代理类。
当然,vector<bool>
有非常特殊的迭代器,允许迭代位集,因此使用迭代器只能解除引用迭代器也会返回代理。