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

时间:2017-01-19 16:01:21

标签: c++ c++11 bitset

我有以下代码

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次重载

但我无法弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:3)

根据C ++ 11标准,如果你的bitset不是const(而你的不是),那么返回一个引用类型:

§20.6.2bitset操作:

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

答案 1 :(得分:1)

C ++中的最小可寻址类型是一个字节,可能是至少8位 [intro.memory/1]。因此,无法返回对单个(小于1个字节)的引用。所以当你需要引用它时,会返回一个执行黑魔法的代理。

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