我想通过引用使用函数来更改std::vector<bool>
中一个变量的状态,但这不起作用,因为std::vector<bool>
是代理对象。但是,当我尝试使用lambda expression
进行更改时,可以对其进行修改。这是一个示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char **argv)
{
vector<bool> v(10, true);
auto modify_bool = [](auto b){ b = false; };
modify_bool(v[1]);
for(bool b:v)
cout << b << endl;
return 0;
}
我可以看到v[1]
已更改为false
。我的问题是auto
和modify_bool
的{{1}}推导的类型是什么?
答案 0 :(得分:2)
在非常量std::vector<T>::operator[]
对象上调用vector
返回一个
std::vector<T>::reference
,在大多数情况下为T&
。
但是,在std::vector<bool>
的情况下,其内部存储 可能已优化为将多个bool
作为位存储在单个字节中,而不是使用常规的{ {1}}数组,在这种情况下,bool[]
不能是普通的reference
。相反,它是具有bool&
和operator=
实现的代理对象,用于在operator bool()
的内部表示形式中分配/读取特定的bool
元素。
该代理的类型未指定并且特定于实现,但是vector
仍然可以推断出它。