自动声明的变量有时是通过引用声明的
variable declared by auto sometimes is by reference?
我刚刚测试了这段代码。
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]
寻址它的元素是行不通的(因为你不能寻址位的地址),如果b1
是通过对v.back()
的引用来声明的,为什么我可以通过&b1
来寻址b1
? - 在什么情况下
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>
有非常特殊的迭代器,允许迭代位集,所以使用迭代器只有一个缺点,即取消引用迭代器也会返回代理。
相关文章:
- 错误:使用通用引用的声明冲突
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 为什么转发声明的好友类不能在类中引用?
- 如何在方法主体中返回声明向量的引用?
- using声明不能引用类成员
- 是否可以在 using 声明中引用用户定义的转换模板?
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- C++中未初始化的引用(使用 extern 声明)
- 字符串声明/引用参数(c++)的困难
- 如何声明引用自身的typedef
- 在C++中,我们不能在没有初始化的情况下声明引用。为什么?
- 声明引用适用于类,但不适用于主函数
- 除了类型 &var=var 之外,还有哪些方法可以在C++中声明引用?
- 对派生类的构造函数的未声明引用
- 声明引用的C++开销
- 在循环中声明引用变量