auto声明的变量有时是通过引用?

时间:2014-12-05 02:14:37

标签: c++ c++11 auto

我刚测试了这段代码。

vector<bool> v(5, true);
if(v.back())cout<<"====="<<endl;
auto b1 = v.back();
b1 = false;
cout<<&b1<<endl;
if(v.back())cout<<"*********"<<endl;

我的问题如下:

  1. “*********”(没有引号)没有出现在输出中,为什么声明的变量 auto正在更改布尔矢量v
  2. 我知道vector<bool>不是标准的STL容器,并且&v[4]解决它的元素将无效(因为你无法解决一点地址),如果{{ 1}}是由对b1的引用声明的,为什么我可以通过v.back()解决b1
  3. &b1在什么情况下有这种行为? auto以及之后的auto c1 = v.begin()会更改c1 = (++v.begin())吗?

1 个答案:

答案 0 :(得分:11)

vector<bool>标准库失败,vector<T> 不是T s 的容器。

因此,它与vector的所有其他实例化具有明显不同的行为。

您偶然发现的特定疣是它的成员类型reference代理类,表示对单个bool 的引用。

这意味着auto从不推断作为参考,推断为该代理类,将表现为,就好像它是一个参考。 / p>

&v[4]无法在索引4处获取指向bool的指针,因为vector<bool>不是bool的容器,而index-operator也返回那些代理类。

当然,vector<bool>有非常特殊的迭代器,允许迭代位集,因此使用迭代器只能解除引用迭代器也会返回代理。