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