自动声明的变量有时是通过引用声明的

variable declared by auto sometimes is by reference?

本文关键字:声明 引用 变量      更新时间:2023-10-16

我刚刚测试了这段代码。

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]寻址它的元素是行不通的(因为你不能寻址位的地址),如果b1是通过对v.back()的引用来声明的,为什么我可以通过&b1来寻址b1
  3. 在什么情况下auto有这种行为?auto c1 = v.begin()及以后做c1 = (++v.begin())会改变v.begin()吗?

>std::vector<bool>是标准库中的故障,vector<T>不是T的容器

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

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

这意味着auto从不推导为引用,推导为代理类,将表现得好像它是参考一样。

&v[4]无法获取指向索引 4 处bool的指针,因为vector<bool>不是bool的容器,索引运算符也返回这些代理类。

当然,vector<bool>有非常特殊的迭代器,允许迭代位集,所以使用迭代器只有一个缺点,即取消引用迭代器也会返回代理。