c++ - 如何告诉 auto 推断向量元素的非引用类型
问题描述
这是代码:
int main()
{
std::vector<bool> b(5,false);
auto b0=b[0];
cout<<b0;
b[0]=true;
cout<<b0;
std::vector<int> i(5,false);
auto i0=i[0];
cout<<i0;
i[0]=true;
cout<<i0;
return 0;
}
0100
变量 b0 是引用类型(std::_Bit_reference),而 i0 是普通 int。告诉 auto 推断出一些非引用类型(例如 bool)的正确语法是什么?
解决方案
您得到std::_Bit_reference
,因为模板专业化(即)std::vector
具有“可能”节省空间的实现。bool
std::vector<bool>
正如cppreference 所说,vector 将值存储在位而不是字节中:
使 std::vector 节省空间的方式(以及是否完全优化)是实现定义的。一种潜在的优化涉及合并向量元素,以便每个元素占用一个位而不是 sizeof(bool) 字节。
正如templatetypedef所说,auto
它首先可以推断出,这恰好是从位中获取布尔值的一些奇特类型。
将类 std::vector::reference 公开为访问单个位的方法。特别是,此类的对象由 operator[] 按值返回。
>operator bool() const;
>(until C++11)
>operator bool() const noexcept;
>(since C++11)
>Returns the value of the referenced bit.
它可以隐式转换为布尔值(AFAIK),因此您不必担心将其传递给需要bool
参数的函数。
推荐阅读
- tensorflow - 使用toco将pb转换为tflite时,toco成功了,但是没有结果
- angular - 在 ts 代码中添加到元素时,为什么不使用角度材料工具提示?
- sql - amazon-redshift : 选择 id, first(a),sum(b) group by id
- java - 内部最终对象(Java)上可能存在内存泄漏
- hive - Hive 表更新错误尝试使用不支持这些操作的事务管理器进行更新或删除
- python - 如何根据脚本位置下载图像并将其放在新目录中?
- c# - 如何将多个对象从控制器操作传递到 MVC 中的视图?
- jdbc - 无法在安装它的系统之外访问greenplum?
- java - 改变屏幕亮度而不是睡眠
- javascript - 为什么我不能从 Koa 路由器提供静态文件?