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



我想通过引用更改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_boolb auto推断出的类型是什么?

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

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

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

最新更新