在lambda表达式中由auto推断的类型,用于修改bool类型的向量(特殊容器)

时间:2019-01-06 16:57:46

标签: c++ lambda c++14 generic-lambda

我想通过引用使用函数来更改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。我的问题是automodify_bool的{​​{1}}推导的类型是什么?

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仍然可以推断出它。