我想通过引用更改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
.我的问题是modify_bool
和b
auto
推断出的类型是什么?
在非常量vector
对象上调用 std::vector<T>::operator[]
返回 std::vector<T>::reference
,在大多数情况下是T&
。
但是,在std::vector<bool>
的情况下,其内部存储可以优化为将多个bool
作为位存储在单个字节中,而不是使用普通的bool[]
数组,在这种情况下reference
不能是正常的bool&
。相反,它是一个代理对象,它operator=
和operator bool()
实现来分配/读取vector
内部表示中的特定bool
元素。
该代理的类型未指定且特定于实现,但auto
仍然可以推断出它。