C++ 为什么自动推断std::bitset::operator[]的引用对象而不是bool
我有以下代码C++ 为什么自动推断std::bitset::operator[]的引用对象而不是bool,c++,c++11,bitset,C++,C++11,Bitset,我有以下代码 std::bitset<32> bs{21}; auto ref_obj = bs[0]; auto &another_ref = bs[0]; bool bool_obj = bs[0]; std::位集bs{21}; 自动参考对象=bs[0]; 自动&另一个_ref=bs[0]; bool bool_obj=bs[0]; ref_obj的类型不是bool。但是另一个\u ref的类型与ref\u obj相同std::bitset::operator[]在
std::bitset<32> bs{21};
auto ref_obj = bs[0];
auto &another_ref = bs[0];
bool bool_obj = bs[0];
std::位集bs{21};
自动参考对象=bs[0];
自动&另一个_ref=bs[0];
bool bool_obj=bs[0];
ref_obj
的类型不是bool
。但是另一个\u ref
的类型与ref\u obj
相同std::bitset::operator[]
在下面列出了3个重载
但是我不明白为什么会这样。根据C++11标准,如果您的位集不是
常量(而您的位集不是),则返回一个引用类型:
§20.6.2位集操作:
constexpr bool operator[](size_t pos) const; // for b[i];
reference operator[](size_t pos); // for b[i];
< > C++中的最小可寻址类型是一个字节,它大概是至少8位。因此,无法返回对单个位(小于1字节)的引用。因此,当您需要引用它时,将返回一个执行一些黑魔法的代理
您的对象不是const
,因此假定您可能希望通过[]
操作符修改元素。您可以将其强制转换为常量
引用,并访问常量
限定成员重载。查看重载2(引用运算符[](std::size_t pos);
)。您的对象不是const
。是。我想就是这样。