用于修改 bool 类型向量(特殊容器)的 lambda 表达式中 auto 推导的类型是什么

What's type deduced by auto in lambda expression used to modify a vector of type bool (special container)

我想通过引用使用函数更改 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_boolbauto 推导出的类型是什么?

在非常量 vector 对象上调用 std::vector<T>::operator[] returns a std::vector<T>::reference,在大多数情况下是 T&

然而,在 std::vector<bool> 的情况下,其内部存储 可能 被优化为将多个 bool 存储为单个字节中的位,而不是使用普通的 bool[] 数组,在这种情况下 reference 不能是普通的 bool&。相反,它是一个代理对象,其中 operator=operator bool() 实现为 assign/read vector 内部表示中的特定 bool 元素。

该代理的类型未指定且特定于实现,但auto 仍然可以推断出它。