为什么 auto 为 std::bitset::operator [] 推导一个引用对象而不是 bool

Why auto deduces a reference object instead of bool for std::bitset::operator []

我有以下代码

std::bitset<32> bs{21};
auto ref_obj = bs[0];
auto &another_ref = bs[0];
bool bool_obj = bs[0];

ref_obj 的类型不是 bool。但是 another_refref_obj 具有相同的类型。 std::bitset::operator[]http://en.cppreference.com/w/cpp/utility/bitset/operator_at

中列出了 3 个重载

但我想不通为什么会这样。

根据 C++11 标准,如果您的位集不是 const(而您的也不是),则返回一个引用类型:

§20.6.2 位集操作:

constexpr bool operator[](size_t pos) const; // for b[i];
reference operator[](size_t pos); // for b[i];

C++ 中的最小可寻址类型是一个字节,大概是至少8 位 [intro.memory/1]。因此,无法 return 引用单个 (小于 1 个字节)。因此,当您需要对此进行引用时,returned.

执行一些黑魔法的代理

您的对象不是 const,因此假设您可能希望通过 [] 运算符修改元素。您可以将其转换为 const 引用并访问 const 限定成员重载。