Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';在lambda表达式中由auto推导的s类型,用于修改bool类型的向量(特殊容器)_C++_Lambda_C++14_Generic Lambda - Fatal编程技术网

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