首页 > 解决方案 > 如何告诉 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)的正确语法是什么?

标签: c++c++11auto

解决方案


您得到std::_Bit_reference,因为模板专业化(即)std::vector具有“可能”节省空间的实现。boolstd::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参数的函数。


推荐阅读