c++ - 用于修改 bool 类型 vector (特殊容器)的 lambda 表达式中 auto 推导的类型是什么

标签 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 .我的问题是 auto 推导的类型是什么?的 modify_boolb

最佳答案

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

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

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

关于c++ - 用于修改 bool 类型 vector (特殊容器)的 lambda 表达式中 auto 推导的类型是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063858/

相关文章:

c++ - CRTP和c++1y返回类型推导

c++ - 推导初始化列表大小的模板参数

c++ - 为什么在应用服务器项目中使用不止一种语言?

c++ - ‘multiline’不是 ‘std::__cxx11::regex’ 的成员

java - 如何检测我何时处于最后一个循环? ( lambda )

Python:使用 Lambda 将字符串字段拆分为 3 个单独的字段

c++ - 为什么我这里不需要SFINAE

c++ - 学习 C++ 并在早期示例中遇到错误(非静态数据成员之前需要构造函数)

c++ - 解析问题 - Opencv 与 Xcode

Java Stream Collect - 如何推断类型?