C++ 什么';在lambda表达式中由auto推导的s类型,用于修改bool类型的向量(特殊容器)
我想通过引用函数更改C++ 什么';在lambda表达式中由auto推导的s类型,用于修改bool类型的向量(特殊容器),c++,lambda,c++14,generic-lambda,C++,Lambda,C++14,Generic Lambda,我想通过引用函数更改std::vector中一个变量的状态,但这不起作用,因为std::vector是代理对象。但是,当我尝试使用lambda表达式更改它时,我可以修改它。下面是一个例子: #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(int argc, char **argv) { vector<bool>
std::vector
中一个变量的状态,但这不起作用,因为std::vector
是代理对象。但是,当我尝试使用lambda表达式更改它时,我可以修改它。下面是一个例子:
#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;
}
#包括
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv)
{
向量v(10,真);
自动修改布尔=[](自动b){b=false;};
修改_bool(v[1]);
对于(布尔b:v)
cout对非常量vector
对象调用std::vector::operator[]
返回一个
std::vector::reference
,在大多数情况下是T&
然而,在std::vector
的情况下,其内部存储可以优化为将多个bool
存储为单个字节中的位,而不是使用普通的bool[]
array,在这种情况下,reference
不能是正常的bool&
。它是一个代理对象,具有操作符=
和操作符bool()
实现,用于分配/读取向量内部表示中的特定bool
元素
该代理的类型未指定且特定于实现,但是auto
仍然可以推断它。std::vector::operator[]
返回std::vector::reference
。这就是auto
的推论。您可以阅读库文档或使用typeinfo
来回答这个问题。请注意modify\u bool
不能保证修改v[1]
因为打包优化和代理是可选的。@我想如果我想在没有自动的情况下编写代码,我该如何编写?@Ja_cpp最简单的方法是[](decltype(v[0])b){b=false;};
在本例中基本上与自动相同,或者您喜欢使用完整的限定名std::vector::reference b