1

我想在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我的问题是ofmodify_bool和推导出的类型是什么b

4

1 回答 1

2

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

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

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

于 2019-01-06T17:20:27.917 回答